大範圍內素數的求法

2021-06-26 17:53:26 字數 2792 閱讀 7817

素數的定義:只能被1和它自己整除的自然數稱為素數,特別規定1不屬於素數。

根據素數的定義,很明顯,如果乙個數是素數<==>它的因子只包含1和它本身。因此可以根據判別某個數的因子的方法來判斷其是否是素數。

view source

print?

01intisprime(intn)

02

10}

11return1;

12}

但是如果要求求出1000000以內的所有素數,上面的方法效率就很低,因此通常採用篩選法去求素數。篩選法:對於乙個數n,如果是素數,那麼2*n,3*n,4*n,必定不是素數。

01boolisprime[1000001];

02intprime[80000];

03intnum=0;

04

05voidgetprime()//用篩選法求算素數

06

12for(i=2;i<=1000;i++)//如果isprime[i]==true,即i是素數,那麼i,2*i,3*i必定不是素數

13

19}

20for(i=2;i<1000001;i++)

21

26}

27}

篩選法求素數有乙個很通用的演算法,就是在遍例該集合時,比方檢驗乙個數n是否素數,用n除以2-n的開方,只要有乙個能整除,就說明n不是素數。另外這道題要求用陣列來計算。

所謂"篩選法"指的是"埃拉託色尼(eratosthenes)篩法"。他是古希臘的著名數學家。他採取的方法是,在一張紙上寫上1到100全部整數,然後逐個判斷它們是否是素數,找出乙個非素數,就把它挖掉,最後剩下的就是素數。

具體做法如下:

先將1挖掉(因為1不是素數)。

用2去除它後面的各個數,把能被2整除的數挖掉,即把2的倍數挖掉。

用3去除它後面的各數,把3的倍數挖掉。

分別用4、5…各數作為除數去除這些數以後的各數。這個過程一直進行到在除數後面的數已全被挖掉為止。例如找1~50的素數,要一直進行到除數為47為止(事實上,可以簡化,如果需要找1~n範圍內素數表,只需進行到除數為n^2(根號n),取其整數即可。例如對1~50,只需進行到將50^2作為除數即可。)

如上演算法可表示為:

挖去1;

用剛才被挖去的數的下乙個數p去除p後面各數,把p的倍數挖掉;

檢查p是否小於n^2的整數部分(如果n=1000, 則檢查p<31?),如果是,則返回(2)繼續執行,否則就結束;

紙上剩下的數就是素數。

01#include

02#include

03intmain(void)

04

17intn = 0;// 對輸出素數計數, 以控制換行顯示

18for(i = 2; i <= 100; i++)// 輸出素數

19

25if(n == 10)

26

30}

31printf("\n");

32return0;

33}

Python 輸出指定範圍內的素數

兩種方法比較其運算時間 在這裡 python 輸出指定範圍內的素數 素數 prime number 又稱質數,有無限個。除了1和它本身以外不再被其他的除數整除。以下例項可以輸出指定範圍內的素數 使用者輸入指定的數字範圍 a int input 輸入區間最小值 b int input 輸入區間最大值 ...

求乙個範圍內的素數

學演算法時候,求素數總是一道逃不掉的練習題。好久沒寫演算法相關的練習了,學習了python 就拿它來練一下手吧。在求素數之前,首先我們了解一下 什麼是素數。按維基百科的說法是 素數指在大於1的自然數中,除了1和此整數自身外,無法被其他自然數整除的數 也可定義為只有1和本身兩個因數的數 因此我們可以總...

lucene RangeQuery範圍內搜尋

queryparser可以使用 起始 to 終止 表示式,起始 to 終止 表示式來構造rangequery物件。private term begin,end begin new term pubmonth 201001 end newterm pubmonth 201501 rangequery ...