让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:20输出样例:
4
分析:
简单来说就是先筛选出不超过N的所有素数, 两个相邻且差值为2的素数为一对素数对, 找出小于N的素数对的对数.
我们可以一次性筛选出N范围内的所有素数, 在对满足条件的素数对求和.
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int pri[100110] = {0};
int prime(int a) {
if(a % 2 == 0 && a != 2) {
return 0;
}
for(int i = 3; i * i <= a; i++) {
if(a % i == 0) {
return 0;
}
}
return a != 1;
}
int main() {
int n;
int sum = 0, sub = 0;
cin >> n;
for (int i = 2; i <= 100010; i++) { //一次性筛选出最大范围内的所有素数
if(prime(i)) {
pri[sub++] = i;
}
}
for(int i = 1; pri[i] <= n; i++) { //求出n以内的素数对的对数
if(pri[i] - pri[i - 1] == 2) {
sum++;
}
}
cout << sum << endl;
return 0;
}