C语言(17)孪生素数问题

来源:互联网 发布:CSI网络犯罪调查百度云 编辑:程序博客网 时间:2024/05/21 04:17
描述
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
114
样例输出
4
#include <stdio.h>#include <math.h>int func(int);int main(void){int n, m, i, j, num;int buf[100000]={0};scanf("%d", &n);j=0;buf[j++]=2;/*把2到1000000的素数放到数组里*/for(i=3; i<1000001; i += 2){if(func(i) == 1){buf[j++] = i;}}while(n--){num=0;scanf("%d", &m);for(i=1; i<=m; i++){if(buf[i]>m){break;}if((buf[i]-buf[i-1] == 1) || (buf[i]-buf[i-1] == 2)){num++;}}printf("%d\n", num);}return 0;}/*求是否为素数*/int func(int n){if(n<2){return -1;}int i;for(i=2; i<=sqrt(n); i++){if(n%i==0){return 0;}}return 1;}
大神的代码
 #include <iostream>#include<math.h>using namespace std;bool vis[1000010];int main(){int n=1000010;int m =sqrt(n+0.5);int c=0;for(int i =2;i<=m;i++)if(!vis[i]){for (int j = i*i;j<=n;j+=i) vis[j]=1; }cin>>n;while(n--){int count=0,m;cin>>m;for(int i=3;i<m-1;i++){if(!vis[i] && !vis[i+2]) count++;}if(m>3)cout<<count+1<<endl;else if(m==3) cout<<"1"<<endl;else cout<<"0"<<endl;}return 0;}