让我们定义dn为:d2=pn+1−pn,其中 pi 是第 i 个素数。显然有d1>=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
思路一:用埃氏筛法,把筛选出来的素数都存在一个数组里,然后对这个数组进行判断即可得出结果,这个是优化后的算法,过测试5的时候时间只有4ms左右,还有一种比较简单的方法,但是过测试5时耗时17ms左右,不过对于这题,用简单的方法就行了,这里给出埃氏筛法只供学习参考。
#include <iostream>
using namespace std;
int pNum=0,p[100010];
bool prime[100010]={
false};
void Find_Prime(){
//埃氏筛法
for(int i=2;i<100010;i++){
if(!prime[i]){
p[pNum++]=i;
for(int j=i+i;j<100010;j+=i)
prime[j]=true;
}
}
}
int main()
{
Find_Prime();
int n,cnt=0;
cin >>n;
for(int i=1;p[i]<=n;i++)
if(p[i]-p[i-1]==2)
cnt++;
cout <<cnt;
return 0;
}
思路二:
#include <iostream>
using namespace std;
bool isprime(int a) {
for (int i=2;i*i<=a;i++)
if (a%i==0) return false;
return true;
}
int main() {
int N,cnt=0;
cin >>N;
for (int i=5;i<= N;i++) //从5开始才有相邻且差为2的素数
if(isprime(i-2)&&isprime(i))cnt++;
cout <<cnt;
return 0;
}