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的乘積賦值