很多时候我们都需要标记素数为解题服务,但是一个一个判断是否素数是非常浪费时间的。
因此我们需要进行打表(标记)
以下提供一种思路:
- 1.定义一个数组a[N] N 题给范围
- 2.将a[0]、a[1]初始化为1,其余初始化为0
- 3.遍历每一个元素,当元素等于0时,我们将其下标的倍数视为倍数下标,将所有的倍数下标对应的元素赋值1。
核心思想:素数的倍数都不是素数。
#define N 100005
int a[N];
void init(int a[]){
a[0] = 2; a[1] = 2;
for(int i = 0; i < sqrt(N); i++){
if(a[i] == 0){
for(int j = i + i; j < N; j+=i){
a[j] = 1;
}
}
}
}
(素数被标记为0, 合数标记为1, 非质非合数标记为2)