素数筛算法之寻找每个数的最小素因子
//该算法的思路是利用素数筛的想法,当判定一个数为素数后它的倍数必定为合数,此时不必将其标记为1,可以将该素数直接
赋给他的所有倍数,当作这些数的最小素因子,然后依次循环
例如当i=2时,经过if(prime[i])判定为零,不满足条件,则则执行下面的语句:
将2赋值给它的所有倍数,因为它将作为最小素因子
for(int j = i; j <= MAX_N;j += i){
if(prime[j]) continue;//如果当前合数已经被标记了,则跳过
prime[j]= i; //将当前素因子赋值给prime[j]
}
2的所有倍数赋值完后执行i的下一轮循环,执行判断条件
代码:
#include<stdio.h> #define MAX_N 100 int prime[MAX_N + 5];//存储每个数的最小素因子,全局数组每个元素被自动赋值为0 void init(){ for(int i = 2;i <= MAX_N; i++){ if(prime[i]) continue;//如果已经赋值,就跳过 for(int j = i; j <= MAX_N;j += i){ if(prime[j]) continue;//如果当前合数已经被标记了,则跳过 prime[j]= i; //将当前素因子赋值给prime[j] } } return ; } int main(){ init(); for(int i=2;i<= MAX_N;i++){ printf("MIN_factory[%d]= %d\n", i,prime[i]); } return 0; }