欧拉筛法求素数

来源:互联网 发布:php <=和=< 编辑:程序博客网 时间:2024/05/19 04:54

代码


#include <stdio.h>#include <stdbool.h>bool flag[10001] = {0};int p[10001] = {0};int main(){    int i, n, cnt = 0, j;    scanf("%d", &n);    for (i = 2; i <= n; ++i){        if (flag[i] == 0)            p[cnt++] = i;        for (j = 0; j < cnt && i * p[j] <= n; ++j){            flag[i * p[j]] = 1;            if (i % p[j] == 0) break;        }    }    for (i = 0; i < cnt; ++i)        i == cnt - 1 ? printf("%d\n", p[i]) : printf("%d ", p[i]);    return 0;}

说明


  • flag标记下标是否为合数
  • p按顺序存放素数
  • flag[i * p[j]] = 1筛掉i这一素数的素数倍数
  • 若i能整除p[j]则跳出循环,等到p[j]==i时再筛去i*p[j]这个数。即仅在合数的最大因子作为乘数时筛去这一合数。
  • 时间复杂度O(n)