for(int i=2;i<1000001;i++){
if(a[i]==0)b[l++]=i;
for(int j=0;j<l;j++){
if(b[j]*i>1000000)break;
a[b[j]*i]=1;
if(i%b[j]==0)break;
}
}
可快速求一个区间内的素数个数和值
常识
一切合数都可以由一个素数乘合数或素数得来
思想:
首先此算法时间复杂度最低,因为在给相应合数赋1时可以做到不重不漏。
此方法最难之处:
if(i%b[j]==0)break;
如果没有此处那么循环会继续进行,而 i*b[j+1]%b[j]==0;因此某一个合数会被重复赋值。而加上此语句会使每个合数被最小的质因子与i的乘积赋值