我的第一篇博客。
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
这道题刚看完题目时,我第一个想到的是用数组记录所有的素数,再用循环依次比较,但感觉既浪费空间,又浪费时间。
后来又想到斐波那契数列,决定用两个变量,通过在循环过程中,不断地交替值,实时记录结果。
在实现过程中,刚开始,过多的使用if语句,使得逻辑较为混乱,第一次提交检测,竟然直接编译错误,后来理了一下,发现有很多冗余代码,比如,一开始,我给de2赋值,后面还要比较de1和de2的大小,换成de1后,便不需要比较。
在实现的后期,最后一个调试点显示运行超时,换成用sqrt实现判断素数就行了。
#include<stdio.h>
#include<math.h> //调用sqrt函数。
int main(void)
{
int N, count, de1, de2, flag, i, j; //count用来记录结果。
//de1、de2分别用来记录两个相临的较小,较大的素数。
count = de2 = flag = 0;
scanf("%d",&N);
de1 = 3;
for(i = 5; i <= N; i++) //当N < 5时,结果为0。
{
flag = 0;
for(j = 2; j <= sqrt(i); j++) //用sqrt函数来判断素数,可以大幅缩短编译时间。
{
if(i % j == 0)
{
flag++;
}
}
if(flag == 0)
{
de2 = i;
if(de2 - de1 == 2)
{
count++;
}
de1 = de2; //保证交替的完成
de2 = 0;
}
}
printf("%d",count);
return 0;
}