利用厄拉多塞筛法。
这个算法也是leetcode上看到的。
原理:
首先构造一个N+1个元素的bool数组,并且全部置true,
然后从2(2是第一个素数)开始,将2的倍数(要求该数小于sqrt(N),因式分解关于sqrt(N)对称)在table中全部置false,(2的倍数至少有2,所以不是素数),那么最后table中为true的下标就是素数。
然后利用双指针思想不断更新指针就好。
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main()
{
int N;
if(scanf("%d",&N) != EOF)
{
vector<bool> table(N+1,true);
for(int i = 2;i*i < N;i++)
{
if(table[i] == true)
{
for(int j = 2*i;j < N;j+=i)
{
table[j] = false;
}
}
}
int count = 0;
int pre=2;
for(int j = 2;j < table.size();j++)
{
if(table[j] == true)
{
if(j-pre == 2)
{
count++;
}
pre = j;
}
}
cout<<count;
}
return 0;
}