王道計算機機試 巧妙求素數 素數篩法

2021-10-04 17:52:17 字數 1019 閱讀 9570

若乙個數不是素數,則必存在乙個小於它的素數為其的因數。這個命題的正確性是顯而易見的。那麼,假如我們已經獲得了 小於乙個數的所有素數,我們只需確定該數不能被這些素數整除,這個數即為素 數。但是這樣的做法似乎依然需要大量的列舉測試工作。

正因為如此,我們可以換乙個角度,在我們獲得乙個素數時,即將它的所有倍數均標記成非素數,這樣當我們遍歷到乙個數時,它沒有被任何小於它的素數標記為非素數,則我們確定其為素數。

我們按照如下步驟完成工作:

從 2 開始遍歷 2 到 1000000 的所有整數,若當前整數沒有因為它是某個小於 其的素數的倍數而被標記成非素數,則判定其為素數,並標記它所有的倍數為非 素數。然後繼續遍歷下乙個數,直到遍歷完 2 到 1000000 區間內所有的整數。此 時,所有沒被標記成非素數的數字即為我們要求的素數。這種演算法被我們稱為素 數篩法。

#include

using

namespace std;

int prime[

10000];

//儲存篩得的素數

int primesize;

//儲存素數的個數

bool mark[

10001];

//若mark[x]為true,則表示該數x已經被標為非素數

void

init()

//初始化,所有數字均沒被標記

primesize =0;

//得到的素數個數為0

for(

int i =

2; i <

10000

; i++)}

}int

main()

else cout <<

' '<< prime[i]

;//否則在輸出這個數字前輸出乙個空格}}

if(isoutput ==

false

)else cout << endl;

}return0;

}

王道機試練習 求素數

題目描述 給定乙個數 n,要求判斷其是否為素數 0,1,負數都是非素數 輸入 測試資料有多組,每組輸入乙個數 n。輸出 對於每組輸入 若是素數則輸出 yes,否則輸入 no。樣例輸入 13樣例輸出 yes怎樣確定乙個數是素數?我們可以用所有大於 1 小於其本身的整數去試著 整除該數,若在該區間內存在...

王道計算機機試 數字拆解 特殊乘法

寫個演算法,對 2 個小於 1000000000 的輸入,求結果。特殊乘法舉例 123 45 14 15 24 25 34 35 輸入 兩個小於 1000000000 的數 輸出 輸入可能有多組資料,對於每一組資料,輸出 input 中的兩個數按照題目 要求的方法進行運算後得到的結果。第一種方法 i...

王道計算機機試 任意不同進製轉換

求任意兩個不同進製非負整數的轉換 2 進製 16 進製 所給整數在 long 所能表達的範圍之內。不同進製的表示符號為 0,1,9,a,b,f 或 者 0,1,9,a,b,f 輸入 輸入只有一行,包含三個整數 a,n,b。a 表示其後的 n 是 a 進製整數,b 表示欲將 a 進製整數 n 轉換成 ...