1.相关定理:任何一个数都会被其最小质因子筛掉。
例如: 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17等等。
接下来每个乘法算式等号左边第一个数是质数的倍数。
(1)最开始2判定为质数,2×2=4,4被他的最小质因子2筛掉,2%2= =0,退出循环。
(2)之后是3判定为质数,3×2=6,3×3=9被筛掉,同理6,9分别被最小质因子2,3筛掉,3%3= =0。
(3)之后到4,4×2=8,4×3=12。(正常埃氏筛应该是这样),但没筛掉12的原因是12应该被2筛掉,而不是被3,否则之后会重复筛掉12。6×2=12,12应该是倍数i=6的时候,被最小质因子2筛掉。
(4)之后到5判定为质数,5×2=10,5×3=15,5×5=25。5%5= =0。
(5)之后到6,6×2=12,6%2= =0,退出循环.
(6)之后到7判定为质数,7×2=14,7×3=21,7×5=35。
2.i%prime[ j ]==0就退出还有一点(cnt足够大的前提下),就是当i为质数时第一次触发一定是i等于prime[ j ],先执行v[ i×prime[ j ] ]再退出的原因就是此次平方数的最小质因子是相等的,且仍满足被筛的条件(被其最小质因子筛掉),比如4=2×2,此时为边界情况。
for(int i=2; i<=n; i++){
if(!v[i])prime[cnt++]=i;
for(int j=0; j<cnt&&i*prime[j]<=n; j++){
v[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}