尤拉篩法
素數的定義:素數就是除了1和本身之外沒有其他的約數,所以有約數的都不是素數。
因此,埃氏篩法的思想就是:先去掉2的倍數,再去掉3的倍數,再去掉4的倍數,……依此類推,直到最大數小於最後乙個標出的素數的平方,那麼剩下的序列中所有的數都是素數。
o(nloglogn)
時間複雜度的證明戳此鏈結
#include
#include
using
namespace
std;
#define length 1000000
int is_prime[length];
int prime[length];
int main()
}for(;i<=1000000;i++)
if(is_prime[i]==0)
prime[p++]=i;
while(cin>>n)
尤拉篩法的原理同埃氏篩法,只不過多了乙個判斷刪除的過程。
首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候不用繼續篩下去了。
當i是prime[j]的整數倍時(i % prime[j] == 0),i*prime[j+1]肯定被篩過,跳出迴圈。
因為i可以看做prime[j]某個數, i*prime[j+1]就可以看做 prime[j]某個數*prime[j+1] 。而 prime[j] 必定小於 prime[j+1],
所以 i*prime[j+1] 必定已經被 prime[j]*某個數 篩掉,就不用再做了
o(n)
#include
#include
#include
using
namespace
std;
#define length 700001
int is_prime[length];//是否是素數
int prime[length];//素數表
int pri[length];//尤拉函式表
int main()
for (int j = 0; j1;
if (i%prime[j] == 0)
break;}}
return
0;}
線性篩法求素數(埃氏篩法 尤拉篩法)
篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...
素數之埃氏篩法 尤拉篩法
判斷數n是否為乙個素數,基本方法為從2開始向後列舉,若n不能被2,3,4,n 1整除,則n為素數,該判斷方法的時間複雜度為o n o n o n 更快的方法為,當列舉至n sqrt n n 時即可判斷是否為素數,該判斷方法的時間複雜度為o n o sqrt n o n 如下 寫法1,其中sqrt函式...
埃氏篩法與尤拉篩法
給定整數n,請問n以內有多少個素數?摘自挑戰程式程式設計。要列舉n以內素數,可以用埃氏篩法。這是乙個與輾轉相除法一樣古老的演算法。首先,將2到n範圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都劃去。表中剩餘的最小數字是3,它不能被更小的數整除,所以是素數。在將表中所有3的倍數都劃...