埃拉托斯特尼筛法(又称埃氏筛)的基本思想是:要得到自然数n以内的全部素数,必须把不大于的所有素数的倍数剔除,剩下的就是素数。
时间复杂度O(nloglogn)
#include <iostream>
#include <math.h>
using namespace std;
typedef long long ll;
const int MAX = 1e9 + 10;
bool vis[MAX];
ll Sieve(int n)
{
// 统计素数和
ll sum = 0;
int m = (int)sqrt(n + 0.5);
// 把不大于 根n 的所有素数的倍数剔除,剩下的就是素数
for (int i = 2; i <= m; i++)
// 如过vis为0可执行,为1不可执行
if (!vis[i])
{
cout << vis[i] << " " << endl;
// 将i的所有倍数置为1
for (int j = i * i; j <= n; j += i)
vis[j] = true;
sum += i;
}
for (int i = m + 1; i <= n; i++)
if (!vis[i])
sum += i;
return sum;
}
int main()
{
printf("%lld\n", Sieve(1000000000));
return 0;
}