思想:素數的倍數一定不是素數
要得到自然數n以內的全部素數,必須把不大於根號n的所有素數的倍數剔除,剩下的就是素數。
演算法步驟:
給出要篩數值的範圍n,找出n以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉,因為2的倍數一定是合數;再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去。
如果覺得很難理解可以看下這個鏈結,是個動態的:
上題
pat有原題:
令pi表示第i個素數。現任給兩個正整數m <= n <= 10000,請輸出pm到pn的所有素數。
輸入在一行中給出m和n,其間以空格分隔。
輸出從pm到pn的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。
輸入 5 27
輸出 11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
分析
這題需要你輸出第m個到第n個素數,如果一開始不知道這個埃拉託斯特尼篩法,那麼就會像我一開始一樣,將所有數字用是否是素數的函式進行判斷。理解了埃拉託斯的思想後,題目要求的是10000個素數內,它的時間複雜度也就降到了(nlogn).
先上普通方法寫的,在自己電腦上跑是沒問題的,但是計算時間答不到題目要求的1s以內的時間。
//質數(prime number)又稱素數,有無限個。質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。
#include#include#includeusing namespace std;
#define maxsize 1000000
bool isprime(int n)
; //未做標記即為0,表示是質數,不是合數
for (int i = 2; i < maxsize; i++)}}
int temp = a;
for (int y = 2; y < maxsize; y++)
else if (k == b)
cout << y;
else
cout << y << " ";}}
}}
除了注意需要將素數的倍數做標記,還要注意最後輸出的格式,末尾不能有空格。 埃拉託斯特尼篩法 檢定素數
埃拉託斯特尼篩法描述 要得到自然數n以內的全部素數,必須把不大於 給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉 再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉 接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉 不斷重複下去.題目 統計找出一千萬以內,一共有...
埃拉託斯特尼篩法 篩選素數
埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。要得到自然數n以內的全部素數,必須把不大於根號n的所有素數的倍數剔除,剩下的就是素數。演算法思想 要得到自然數n以內的全部素數,必須把不大於 的所有素數的倍數剔除,剩下的就是素數。給出要篩數值的範圍...
埃拉託斯特尼篩法
質數又稱素數。指在乙個大於1的自然數中,除了1和此整數自身外,沒法被其他自然數整除的數。怎麼判斷n以內的哪些數是質數呢?厄拉多塞是一位古希臘數學家,他在尋找素數時,採用了一種與眾不同的方法 先將2 n的各數放入表中,然後在2的上面畫乙個圓圈,然後劃去2的其他倍數 第乙個既未畫圈又沒有被劃去的數是3,...