让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
#include<iostream>
using namespace std;
const int N=100010;//要将空间开得足够大,否则会出现段错误
bool sign[N]={0};
bool prime(int num){//判断一个数是否为素数的函数
if(num==1) return false;
for(int i=2;i<=num/i;i++){
if(num%i==0) return false;
}
return true;
}
int count(int a){
int t=0,c=0;
int p[50010];
if(a<5) return 0;
for(int i=1;i<=a;i++){//标记是否素数
int j=2;
if(!sign[i]){
if(prime(i)){
while(j*i<=a){
sign[j*i]=1;//将素数倍数排除,提高筛查效率
j++;
}
}
else sign[i]=1;
}
}
//将素数整合到p数组
for(int i=1;i<=a;i++){
if(!sign[i]) p[t++]=i;;
}
//逐个判断相邻两个素数是否素数对,并统计素数对个数
for(int i=0;i<t-1;i++){
if(p[i+1]-p[i]==2) c++;
}
return c;
}
int main()
{
int n;
cin>>n;
cout<<count(n)<<'\n';
return 0;
}
//运用到筛质数的算法