
题目简述
让我们定义 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;
}