让我们定义dn为:dn =pn+1 −pn ,其中pi 是第i个素数。显然有d1 =1,且对于n>1有dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105 ),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
参考代码:
#include<stdio.h>
#include<math.h>
int IsPrime(int n); //判断是否为素数
int main()
{
int i,N,cnt=0;
scanf("%d",&N);
for(i=3;i<=N-2;i+=2)
{
if(IsPrime(i)&&IsPrime(i+2))
{
cnt++;
}
}
printf("%d",cnt);
return 0;
}
int IsPrime(int n)
{
int i,flag=1;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0) flag=0;
}
return flag;
}
思路:
题目意思就是计算不超过N的相邻且差为2的素数对(3,5是最小的素数对,5,7也是一对素数对),这题我们可以采用枚举算法找出所有的素数对,代码如下:
for(i=2;i<=N-2;i++)
{
if(IsPrime(i)&&IsPrime(i+2))
{
cnt++;
}
}
上述代码我们从最小的素数开始遍历,保证了枚举了每一种情况,但是这样的效率并不是很高,因为我们知道偶数对不可能存在素数对,这里我对上述算法进行优化(去掉偶数):
for(i=3;i<=N-2;i+=2)
{
if(IsPrime(i)&&IsPrime(i+2))
{
cnt++;
}
}