题目描述
让我们定义 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 ( N < 1 0 5 ) N(N<10^5) N(N<105) ,请计算不超过 N N N 的满足猜想的素数对的个数。
输入格式
输入在一行给出正整数 N N N 。
输出格式
在一行中输出不超过 N N N 的满足猜想的素数对的个数。
样例
输入样例
20
输出样例
4
思路
我们先找出 1 0 5 10^5 105 以内的所有素数,存入线性表 p p p 中,置一计数器 t t t ,当 p i + 1 − p i = 2 p_{i+1}-p_i=2 pi+1−pi=2 时, t ← t + 1 t\gets t+1 t←t+1 ,输出 t t t 的值即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
int i = 0;
int k = (int)sqrt(n);
for (i = 2; i <= k; i++) {
if (n % i == 0) {
break;
}
}
if (i > k) {
return true;
} else {
return false;
}
}
int main(void) {
vector<int> prime_map;
int n, counter = 0;
for (int i = 0; i < 100010; i++) {
if (isPrime(i)) {
prime_map.push_back(i);
}
}
cin >> n;
for (int i = 1; prime_map[i] <= n; i++) {
if (prime_map[i] - prime_map[i - 1] == 2) {
counter++;
}
}
cout << counter << endl;
return 0;