思想:假设全部数均为素数,再通过剔除掉所有合数,剩下的数肯定为素数;
数学原理:任何正整数(除1外),所有正整数均能分解为素数的乘积。
用途:快速找1~K中所有素数;
优化:对于一个合数K,必能在 [2,sqrt(k)]区间找到一个素数因子;
1~K中,合数K最大,选取的因子区间[2,sqrt(k)]包含了其他数A的因子区间[2,sqrt(A)].
TIP:我们不是去找某个数的素数因子,而是通过素数因子来判断一堆数是不是合数
memset(num,1,sizeof num);
int r = sqrt(n);
num[1] = 0 ;
for(int i = 2 ; i <= r ;i++){
if(num[i]) {//判断i有没有被剔除,剔除则已经在[2,sqrt[i]]中被其素数因子找到
for(int j = i*i ; j <= n ; j+=i){
num[j] = 0; //
}
}
}
第二个for循环是i*i :加快速度阿...i的 2~i-1倍 都已经在之前扫过了
例题:传送门