埃拉托斯特尼筛法(又称埃氏筛)的基本思想是:要得到自然数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的所有倍数置为1for (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;
}