题目描述;
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
解题思路:
此题的关键在于如何快速判断一个数是否为素数。可以用动态素数表加快判断,因为所有的合数都是素数的乘积,如果一个数不能被比它小的素数整除,那么它也是个素数。于是建立一个素数数组,从小到大判断一个数是否为素数,若为素数则存入数组中。
代码部分:
#include<stdio.h>
#include<math.h>
int listnum=0,list[30000]={0};
int main()
{
int max,tem,a=2,b=2,count=0;
int judge(int);
scanf("%d",&max);
for(tem=2;tem<=max;tem++)
{
if(judge(tem))
{
b=tem;
if(b-a==2)
count++;
a=b;
}
}
printf("%d",count);
return 0;
}
int judge(int tem)
{
int i;
//判断除以列表中的素数能不能除尽
for(i=0;i<listnum&&list[i]<=sqrt(tem);i++)
{
if(tem%list[i]==0)
return 0;
}
if(tem>1 && listnum<30000)
{
list[listnum]=tem;
//printf("list%d:%d\n",listnum,list[listnum]);
listnum++;
}
return 1;
}