1.原始演算法
就是將質數的定義翻譯成**,就要看i是否能被小於它的sqrt( i )的數整除。
時間複雜度o(n*sqrt(n)) 空間複雜度o(m) m為質數個數。
2.質數篩法
①定義bool is_prime[n+1],初始化為1(奇數為1,偶數為0)
②已經2為最小的質數,將2的倍數的布林值都設為false,如此類推。
要注意的是最好不要把求sqrt(n)放入迴圈體內。
③依據is_prime陣列輸出相應的質數。
時間複雜度近似o(n) 空間複雜度o(n)
#include #include
using namespacestd;bool* prime_sieve(intn) voidmain()
{intn;
cin>>n;bool *primes;
primes=prime_sieve(n);for(int i=2;i<=n;i++)
{if(primes[i])
cout<
cout<
質數相關數學知識:
1.高斯猜測,n以內的素數個數大約與n/ln(n)相當,或者說,當n很大時,兩者數量級相同。這就是著名的素數定理。
2.十七世紀費馬猜測,2的2^n次方+1,n=0,1,2…時是素數,這樣的數叫費馬素數,可惜當n=5時,2^32+1就不是素數,
至今也沒有找到第六個費馬素數。
3.18世紀發現的最大素數是2^31-1,19世紀發現的最大素數是2^127-1,20世紀末人類已知的最大素數是2^859433-1,用十進位制表示,這是乙個258715位的數字。
4.孿生素數猜想:差為2的素數有無窮多對。目前知道的最大的孿生素數是1159142985×2^2304-1和1159142985×2^2304+1。
5.歌德**猜想:大於2的所有偶數均是兩個素數的和,大於5的所有奇數均是三個素數之和。其中第二個猜想是第乙個的自然推論,因此歌德**猜想又被稱為1+1問題。我國數學家陳景潤證明了1+2,即所有大於2的偶數都是乙個素數和只有兩個素數因數的合數的和。國際上稱為陳氏定理。
演算法題 判斷素數 質數
判斷素數 埃拉託斯特尼篩法 這種方法的思想是設定乙個標誌陣列isprimes n 標誌陣列的每一位標示相應的數是不是素數,初始化為全true。演算法從i 2開始,依次將質數的倍數標記為非素數,即將標記陣列的相應位改為false。標記質數的倍數的時候從i i也就是i的平方開始標記,不需要從i j 且j...
判斷素數與產生素數表(質數)
素數在小學數學也叫質數 方法 所謂素數是指除了1和它本身以外,不能被任何整數整除的數,例如17就是素數,因為它不能被2 16的任一整數整除。因此判斷乙個整數m是否是素數,只需把m被2 m 1之間的每乙個整數去除,如果都不能被整除,那麼m就是乙個素數。另外判斷方法還可以簡化。m不必唄2 m 1之間的每...
判斷質數與篩質數
一 判定質數 要判斷乙個數是不是質數,只需遍歷小於等於它的所有數,如果它能被除了1和本身之外的數整除,那麼它就不是質數。很簡單,暴力列舉,如下 1 bool is prime intx 2 但是還可以優化,對於乙個數 x 它有乙個約數 d 那麼 frac 也是 x 的約數,所以我們只需要列舉較小的乙...