让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
首先呢我们需要写一个函数来判断一个数是否为素数,
int sushu(int num) {
for (int i = 2; i <= sqrt(num); i++)
if (num % i == 0)
return 0;
return 1;
}
返回值为1是素数,为0则不是。这里注意我们判断的临界条件:
for (int i = 2; i <= sqrt(num); i++)
是i小于到num的平方根,开始我写的是num/2,但有一例并不能通过,时间过长。为了有效降低时间复杂度我们需要改成sqrt(num),这一点很好理解。完整代码如下:
#include <stdio.h>
#include<math.h>
int sushu(int num) {
for (int i = 2; i <= sqrt(num); i++)
if (num % i == 0)
return 0;
return 1;
}
int main() {
int num;
int total = 0;
scanf("%d", &num);
for (int i = 2; i <= num-2; i++)
{
if (sushu(i) && sushu(i + 2))
total++;
}
printf("%d", total);
return 0;
}
其中我们的素数对判断条件也值得细细品味:
for (int i = 2; i <= num-2; i++)
{
if (sushu(i) && sushu(i + 2))
total++;
}
首先是i的上界-----num-2,我一开始惯性思维写成了num,出现了错误;
其次是我们判断时只需要一重一次循环,首先判断i是否为素数,其次再判断i+2是否为素数即可。
如果我们首先把所有得素数都找出来,在去判断相邻得两个时候差值为2,那就比较麻烦了(题目就是这么引导得)。
好了,欢迎大家的讨论!