
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
vector<int> Prime(int n) { //筛法判断质数
vector<int> prime;
bool *isprimes = new bool[n + 1];
int i, j, k;
for (i = 2; i <= n; ++i) {
isprimes[i] = true;
}
for (i = 2; i <= n; ++i) {
if (isprimes[i] == true) {
for (j = 2; i*j <= n; ++j) {
isprimes[i*j] = false;
}
}
}
for (k = 2; k <= n; ++k) {
if (isprimes[k]) prime.push_back(k);
}
return prime;
}
int main()
{
int n, i, count = 0;
cin >> n;
vector<int> prime = Prime(n);
/*for (i = 0; i < prime.size(); i++) {
cout << prime[i] << " ";
}
cout << endl;*/
int current = 0;
for (i = 1; i < prime.size(); i++) {
if (prime[i] - prime[current] == 2) {
current = i;
count++;
}
else current++;
}
cout << count << endl;
return 0;
}
这道题关键是判断质数那里,我用的筛法,其基本思想为:用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是质数,首先把它筛掉。
剩下的数中选择最小的数是质数,然后去掉它的倍数。依次类推,直到筛子为空时结束(百度百科)。如果用最常见的试除法,复杂度为O(n^2),肯定超时。