题目:
让我们定义
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个素数。显然有
d
1
=
1
d_1=1
d1=1 且对于n>1有
d
n
d_n
dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (N<
1
0
5
10^5
105),请计算不不超过N的满⾜足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例
20
输出样例
4
分析
先判断当前数字i是否是素数,再判断 i + 2 i+2 i+2 是否是素数,满足条件则将计数器加 1 1 1~注意判断是否是素数的时候,循环结束条件是 i i i 的算术平方根!一开始我将循环条件写成了 i / 2 i / 2 i/2, 一直出现超时的情况☹。
代码
#include <iostream>
using namespace std;
int a, b, countNum = 0, n, flag = 0;
int main()
{
scanf("%d", &n);
a = 5;
if(n >= 5) countNum++;
for(int j = 7; j <= n; j++){
flag = 0;
for(int i = 2; i * i < j; i++){
if(j % i == 0){
flag = 1;
break;
}
}
if(flag != 1){
b = j;
if(b - a == 2) countNum++;
a = b;
}
}
printf("%d", countNum);
return 0;
}
代码优化
将判断是否是素数的代码封装成为单独的函数, 在主函数中调用。上面的代码思路是储存上一个素数,再和当前素数做差比较,优化后不需要记忆上一次产生的素数,直接判断当前素数 i i i和 i − 2 i - 2 i−2即可。
#include <iostream>
using namespace std;
int n, countNum = 0;
bool isPrime(int num){
for(int i = 2; i * i <= num; i++)
if(num % i == 0)
return false;
return true;
}
int main()
{
cin>>n;
for(int i = 5; i <= n; i++){
if(isPrime(i - 2) && isPrime(i))
countNum++;
}
cout<<countNum;
return 0;
}