让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过N
的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N
。
输出格式:
在一行中输出不超过N
的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
此题一开始对于素数对的理解是一个关键点。由题目可知:“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。素数对是相差为2,所以并不是素数对,count应该从0开始计数。
#include<stdio.h>
#include<math.h>
int is_prime(int n) //是否为素数的验证
{
if(n == 1) return 0;
else
{
for (int i = 2;i <= sqrt(n);i++)
if (n % i == 0) return 0;
return 1;
}
}
int main()
{
int n,count = 0;
scanf("%d",&n);
for(int i = 3;i < n-1;i++){
if(is_prime(i) && is_prime(i+2)) count++;//素数对相差为2
}
printf("%d\n",count);
return 0;
}
C语言编程提醒:由&&和||运算符组成的逻辑表达式中,为提高程序的执行效率,C语言规定:只对能够确定整个表达式值的最少子表达式进行计算。如A&&B,若A为0,则不计算B。如下例题:
答案:B
解析:这题很多人第一次碰到很容易想当然的选择A项,但是根据以上编程提醒可知,只要计算"&&"的左边部分就可以知道m=0,左边整个式子为0,那么整个式子为0,不需要计算右半部分了,所以n没变,还是等于1。