线性筛算法
一、线性筛
- 标记一个范围内的数字是否是合数,没有被标记的就是素数
- 算法的空间复杂度为 O(N), 时间复杂度为 O(N)
- 总体思想是用一个整数 M 去标记合数 N,其中 N 和 M具有如下性质:
- N 中最小的素数为 p
- N 可以表示成为 p * M
- p 一定小于等于 M 中最小的素因子
- 利用 M * P’ (所有不大于 M 中最小素因子的集合)标记 N1, N2, N3…
线性筛实例代码:
#include <stdio.h>
#define MAX_N 100
void init() {
for (int i = 2; i <= MAX_N; i++) {
if (!prime[i]) prime[++prime[0]] = i;
for (int j = 1; j <= prime[0]; i++) {
if (prime[j] * j > MAX_N) break;
prime[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
}
}
}
int main() {
init();
for(int i = 1; i < prime[0]; i++) {
printf("%d\n", prime[i]);
}
return 0;
}