時間復雜度O(n)當n比較大時歐拉篩法所用的時間比O(nloglogn)的算法的時間少的會越來越明顯
為什么呢?
因為在歐拉篩法中,每一個合數只被訪問並將其所對的f[]的值修改了一次。
下面以求n以內質數為例。
for(i = 2; i <= n; i++) { if(f[i] == 0) { p[++cnt] = i; } for(j = 1; j <= cnt; j++) { if(i * p[j] > n)break;因為求n以內質數。 f[i * p[j]] = 1; if(i % p[j] == 0)break;//這句話是關鍵。這句話保證了一個數被他最大的因數(除自己本身)篩。。。也可以說是被最小的質因數篩。 } }
手推一下可以清晰理解。。。我來寫一下。。。。
就比如12是被2 6 篩掉的,而3 4 並沒有去篩12 就是因為
if(i % p[j] == 0)break;這句話保證了一個數被他最大的因數(除自己本身)篩。
4篩完8 因為4%2==0; 打斷當前循環,沒有去篩12.
延伸一下,既然歐拉篩能保證一個數是被其最小的質因數篩,那么我們就可以利用這一性質來對一個數進行質因數分解
需要加的就是記錄一下被哪個質數篩的。
if(f[i] == 0) { p[++cnt] = i;
s[i]=i; }
f[i * p[j]] = 1;
s[i*p[j]]=p[j];
這兩處寫為這樣,s記錄的就是一個數的最小質因數,那么分解質因數時只需要不斷去除當前數的最小質因數,知道除到1,質因數便分解完了。