1007 素数对猜想
一、题目
让我们定义
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
)
(<10^5)
(<105),请计算不超过N
的满足猜想的素数对的个数。
二、输入输出
输入格式
输入在一行给出正整数N
。
输出格式
在一行中输出不超过N
的满足猜想的素数对的个数。
三、样例
输入样例
20
输出样例
4
四、题目分析
简单的按照模拟的方法,遍历完所有数值对,对每个数值进行判断,可以解决。但是效率不高,可以进行如下优化:
- 所有的素数对都为奇数,循环步长设为2;
- 最小的素数对为(3,5),循环初始值设为5;
- 无需对同一个数值进行两次素数判断,可以设置两个布尔变量保存上一数值的判断结果。
五、代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int count=0;
int n;
cin>>n;
bool num1=true,num2=true;
for(int i=5;i<=n;i=i+2)
{
num2=true;
for(int j=2;j<sqrt(i)+1;j++)
{
if(i%j==0)
{
num2=false;
break;
}
}
if(num1&&num2)count++;
num1=num2;
}
cout<<count;
return 0;
}
六、总结
-
素数的判断:
for (int j = 2; j < sqrt(i) + 1; j++) { if (i % j == 0) { num2 = false; break; } }
循环从
2
开始,到sqrt(i) + 1
,防止浮点误差导致将一些完全平方数(除1和自身以外只含有一个质数因子,如9、25…)判断为素数。
例如i = 9
:
sqrt(i)
为2.99999
,若是只循环至sqrt(i)
,无法对因数3进行判断,因此将9误判为素数。