版权声明:转载请附上链接,虽然我都不信有人转。 https://blog.csdn.net/gezhishigechuan_/article/details/82223819
1007 素数对猜想(20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
无难度,不作分析。
/*总分:20,得分:20*/
#include<stdio.h>
#define YES 1
#define NO 0
int is_prime(int x);
int find_prime_grps(int num);
int main(){
int N;
int grps;
scanf("%d",&N);
if(N<=0||N>=1e5)//判断数据合法性
return 1;
grps=find_prime_grps(N);
printf("%d",grps);
return 0;
}
int is_prime(int x){//此函数目的是判断x是否为素数,这是最基础的算法,可自行更改更好的算法
int flag=0;
int n=2;
while(n*n<=x){
if(x%n==0){
flag=1; //注意:此时为非素数
break;
}
n++;
}
if(!flag)
return YES;
else
return NO;
}
int find_prime_grps(int num){//求最大数2~num中满足题意的素数对
int num_of_grps=0;
int front=0;
int div=0;
for(int i=2;i<=num;i++){//i为不大于num的值,每两个相邻素数需要测试是否满足题意
if(is_prime(i)){
if(i!=2)//2为第一个素数,前面无素数与之比较,故不作处理
div=i-front;//div定义为后者素数与前者素数的差值,front定义为i前面的那个素数
if(div==2)
num_of_grps++;
front=i;
}
}
return num_of_grps;
}