问题描述:
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
解题实现:
#include<stdio.h>
#include<math.h>
int main()
{
int num=0, //记录输入的数据
n=0,
i,t=0,
j=0;
scanf("%d",&num);
int flag[num+1], //起到标记的作用,用来区分素数和非素数
a[num+1],
b[num+1];
for(i=2;i<=num;i++)
flag[i]=1;
n=num; //后面会改变num的值,所以此处用来保留num的初值
while(num!=2) //此处循环的初始值用到一个小技巧
{
for(i=2;i<sqrt(num)+1;i++) //素数求法
{
if(num%i==0)
{
flag[num]=0; //此处标记非素数num的flag[num]为0,以此区分素数和非素数
break; //若num是非素数,则跳出检测是否是素数的循环,继续测试num-1
}
}
num--;
}
for(i=2;i<=n;i++)
if(flag[i]==1) //循环挑出所有素数并将所有素数保存到数组b[j]
{
b[j]=i;
j++; //游标右移
}
for(i=0;i<j;i++) //循环输出所有素数对
{
if(b[i+1]-b[i]==2)
t++;
}
printf("%d",t);
}
解题思路:
见注释
[注意]:continue和break的区别:continue跳出本次循环,继续执行下一次循环,break跳出本层循环.