欧拉筛法求质数完整代码c语言,欧拉筛法(素数的判断)

素数的筛法(欧拉筛法)

由于普通的素数判断直接可以出,所以这块只展示一个能够解决数据范围大于1e6的一个算法:欧拉筛法

基本思路:

1.使用一个prime[N]存下当前素数

2.使用一个on[N]数组标志i 是不是素数。

3.每一个素数都将其当前的i倍数标记为非素数(凡是有因子的数一定不是素数)。

下面是例题

【题目描述】

求1,2,⋯,N 中素数的个数。

【输入输出格式】

【输入】:

一个整数N。

【输出】:

1 个整数,表示素数的个数。

TEL:

• 对于40% 的数据,1≤ N ≤10 6

• 对于80% 的数据,1≤ N ≤10 7

• 对于100% 的数据1≤ N ≤10 8

对于题目的思考:

这么大的数据如果真的要让普通判断方法,那么一定会超时(O(n2)).那么就需要一个黑科技来解决——欧拉筛法。

代码如下:

#include

using namespace std;

const int N = 100000100;

int cnt, n;

int prime[N];

bool on[N];

int main()

{

scanf("%d", &n);

on[0] = on[1] = 1;

//0和1不是素数

for(int i = 2; i <= n; ++i){

if(!on[i])prime[++cnt] = i;

//素数存入栈中

for(int j = 1; j <= cnt && i * prime[j] <= n; ++j){

on[i * prime[j]] = 1;

//标记为不是素数

if(i % prime[j] == 0) break;

//此处是精髓,如果当前的i能够被整除,那么这个数之前一定已经被处理过了,然后直接跳过。(欧拉筛法的关键)

}

}

long long tot = 0;

for(int i = 2; i <= n; ++i)

if(!on[i]) tot++;

printf("%lld\n", tot); //计算数量

//不过作者此处还有一个思路,就是由于存进去时候是有序的,所以使用一下low_bound()[上一篇博客有使用方法],或者二分查找也可以的。

return 0;

}

希望这些能对大家有帮助。

你可能感兴趣的:(欧拉筛法求质数完整代码c语言)