题目如下:
要求及样例:
先说说思路,肯定第一步要先判断素数,但是后面要进行计算,所以需要一个数组来保存数据;
判断素数的最大范围为(sqrt(i)+1)(解释一下,一个合数的两个因子中,必有一个小于或等于它的平方根,只需找到比其平方根小的那一个即可,sqrt得到的是浮点数,不精确,为了减小误差所以+1),由于偶数必有一个因子2,可以继续缩小范围,只判断从3开始的奇数;后面就是计算。
#include <stdio.h>
#include <math.h>
int a[50000];
int main()
{
int N=0;
int cnt=0;
scanf("%d",&N);
int i,j,limit,n;
int flag=1;
int k=0;
for(i=3,n=1;i<=N;i=2*n+1){//需判断的数的范围(排除偶数);
//判断素数;
limit=sqrt(i)+1;
for(j=2;j<=limit;j++){
if(i%j==0){
flag=0;
break;
}
}if(flag){
a[k]=i;
k++;
}
flag=1;
n++;
}
for(i=0;i<k;i++){
if(a[i+1]-a[i]==2){
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}
/*总结:
判读素数的常见方法:
1.2~n-1所有的数试一遍;
2.2~n/2(一个合数的最小因子为2(除去1和他本身),最大因子为n/2);
3.2~sqrt(n)+1(一个合数的两个因子中必有一个小于或等于sqrt(n),必有一个大于或等于sqrt(n),+1是减小误差);
4.可以排除上述区间的偶数(从3开始的奇数开始判断);*/