让我们定义dnd_ndn为:dn=pn+1pnd_{n}=p_{n+1}p_{n}dn=pn+1pn,其中pip_ipi是第iii个素数。显然有d1=1d_1=1d1=1,且对于n>1n>1n>1有dnd_ndn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105)N(<10^5)N(<105),请计算不超过NNN的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
解题思路
遍历素数,一般的 O(n2)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;
}
}