下面是代码和注释:
#include <iostream>
#include <cmath>
using namespace std;
bool prime(int a) { //判断一个数是否是素数
int i, k = sqrt(a);
for (i = 2; i <= k; i++)
if (a % i == 0) break;
if (i >= k + 1) return true;
else return false;
}
int main()
{
int N;
cin >> N;
int tag = 0; //统计有多少对符合条件的素数对
/* i 取5的原因:
i=2时,3和2相差为1,不满足条件,而且后面 i 要加2,所以舍弃
i=3时,即循环为:
for (int i = 3; i < N; i += 2) {
if (prime(i)) {
if (prime(i + 2))
tag++;
}
}
这种情况下会出现 i 大于N也符合条件的情况,比如N=12时,输出的结果会不正确。
*/
for (int i = 5; i <= N; i += 2) { //偶数不可能是素数,所以 i 直接加2
if (prime(i)) { //如果一个数是素数
if (prime(i - 2)) //判断该数减2是否也是素数
tag++; //同时满足,tag加1
}
}
cout << tag;
return 0;
}