让我们定义 d n d_n dn为: d n = p n + 1 p n d_{n}=p_{n+1}p_{n} dn=pn+1pn,其中 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的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
解题思路
遍历素数,一般的 O ( n 2 ) O(n^{2}) O(n2) 算法会严重超时,需要进行剪枝操作。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
int cont = 0;
int front = 3;
if (n <= 3)
cout << "0" << endl;
else {
for (int i = 5; i <= n; i++) {
int x = 2;
int tmp = sqrt(i) + 1; // 剪枝,否则最后一项会超时
while (x <= tmp) {
if (i%x != 0)
x++;
else
break;
}
if (x > tmp) {
if (i - front == 2)
cont++;
front = i;
}
}
cout << cont << endl;
}
}