PAT 乙级 -- 1007 -- 素数对猜想

题目简述

      让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
      现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例
20

输出样例
4

C++代码样例

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string.h>

using namespace std;

bool isPrime(int p) //素数判定
{
    int i = 0;
    for(i=2;i<=sqrt(p);i++)
    {
        if(p%i==0)
        {
            return false;
        }
    }
    return true;
}

void setPrime(long (&Prime)[10005], const int N) //按照要求在数组中置素数
{
    int p = 1; //素数
    int i = 0; //Prime数组序数
    while(1)
    {
        if(isPrime(p))
        {
            if(p>N)
            {
                return;
            }else{
                Prime[i] = p;
                i++;
            }
        }
        p++;
    }
    return;
}

void clacBetPrime(long (&Prime)[10005], long (&betPrime)[10005]) //计算素数数组差值
{
    int i = 0, j = 1;
    while(Prime[j] != 0)
    {
        betPrime[i] = Prime[j] - Prime[i];
        i++;
        j++;
    }
    return;
}

int main(void)
{
    int i=0,j=0;
    int N = 0;
    int count = 0;
    long Prime[10005];
    long betPrime[10005];
    memset(Prime,0,sizeof(Prime));
    memset(betPrime,0,sizeof(betPrime));
    scanf("%d",&N);
    setPrime(Prime,N);
    clacBetPrime(Prime,betPrime);
    for(i=0; betPrime[i]!=0; i++)
    {
        if(betPrime[i] == 2)
        {
            count++;
        }
    }
    printf("%d",count);
    return 0;
}