PAT乙级 | 1007 素数对猜想 (20分)

让我们定义d​​n为:d2=p​n+1−p​n,其中 p​i 是第 i 个素数。显然有d1>=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N。

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

思路一:用埃氏筛法,把筛选出来的素数都存在一个数组里,然后对这个数组进行判断即可得出结果,这个是优化后的算法,过测试5的时候时间只有4ms左右,还有一种比较简单的方法,但是过测试5时耗时17ms左右,不过对于这题,用简单的方法就行了,这里给出埃氏筛法只供学习参考。

#include 
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 
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;
}

你可能感兴趣的:(PAT,算法,c++,PAT)