让我们定义
d
n
d_n
dn 为:
d
n
=
p
n
+
1
−
p
n
d_n =p_{n+1} −p_n
dn=pn+1−pn ,其中
p
i
p_i
pi 是第
i
i
i个素数。显然有
d
1
=
1
d_1 =1
d1=1,且对于
n
>
1
n>1
n>1有
d
n
d_n
dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数
N
(
<
1
0
5
)
N(<10^5 )
N(<105),请计算不超过
N
N
N的满足猜想的素数对的个数。
四【题目示例】
输入格式: 输入在一行给出正整数
N
N
N。
输出格式: 在一行中输出不超过
N
N
N的满足猜想的素数对的个数。
输入样例: 20
输出样例: 4
五【解题思路】
这个题还是比较好想的,主要思路就是枚举1~n(包括n,因为题目说不超过,所以是≤)中的所有素数,然后遍历判断两个素数是否相邻即可。但是有些小细节需要注意如下: ①:要知道1不是素数,虽然2是素数,但是没有能和它配对的,所以2也不计算在内 ②:
f
o
r
for
for循环每次的增长为2,原因是从3开始,保证以奇数增长,因为偶数肯定不是素数(除了2),所以之判断奇数即可 ③:要保证
i
&
&
i
+
2
≤
n
i \quad \&\& \quad i+2 ≤ n
i&&i+2≤n ④:编写判断素数的函数不能直接从头到尾遍历,否则其中有一个用例一直运行超时,所以需要优化:我们知道如果一个数能被2~n之间的任一整数整除,其中有一个因子必然小于等于
m
\sqrt{m}
m
,另一个因子必然大于等于
m
\sqrt{m}
m
,他们都是成对出现的,所以我们只需要遍历从2到
m
\sqrt{m}
m
,如果不是素数,自然有因子被取模等于0,这样就可以判断了,而且速度更快
六【最终得分】
20分
七【代码实现】
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
bool isPrimeNumber(int x)
{
int sqr = (int)sqrt(1.0*x);
for(int i = 2;i<=sqr;i++)
{
if(x % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int n,res = 0;
scanf("%d",&n);
for(int i = 3;i + 2 <= n;i+=2)
{
if(isPrimeNumber(i)&& isPrimeNumber(i+2))
{
res++;
}
}
printf("%d",res);
return 0;
}