最直觀的方法,根據定義,因為質數除了1和本身之外沒有其他約數,所以判斷n是否為質數,根據定義直接判斷從2到n-1是否存在n的約數即可。c++**如下:
[cpp]view plain
copy
bool
isprime_1(
intnum )
上述判斷方法,明顯存在效率極低的問題。對於每個數n,其實並不需要從2判斷到n-1,我們知道,乙個數若可以進行因數分解,那麼分解時得到的兩個數一定是乙個小於等於sqrt(n),乙個大於等於sqrt(n),據此,上述**中並不需要遍歷到n-1,遍歷到sqrt(n)即可,因為若sqrt(n)左側找不到約數,那麼右側也一定找不到約數。c++**如下:
[cpp]view plain
copy
bool
isprime_2(
intnum )
3)另一種方法
首先看乙個關於質數分布的
規律:大於等於5的質數一定和6的倍數相鄰。例如5和7,11和13,17和19等等;
證明:令x≥1,將大於等於5的自然數表示如下:
······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······
可以看到,不在6的倍數兩側,即6x兩側的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再除去6x本身,顯然,素數要出現只可能出現在6x的相鄰兩側。這裡有個題外話,關於孿生素數,有興趣的道友可以再另行了解一下,由於與我們主題無關,暫且跳過。這裡要注意的一點是,在6的倍數相鄰兩側並不是一定就是質數。
根據以上規律,判斷質數可以6個為單元快進,即將方法(2)迴圈中i++步長加大為6,加快判斷速度,**如下:
[cpp]view plain
copy
bool
isprime_3(
intnum )
{ //兩個較小數另外處理
if(num ==2|| num==3 )
return
1 ;
//不在6的倍數兩側的一定不是質數
if(num %6!= 1&&num %6!= 5)
return
0 ;
inttmp =sqrt( num);
//在6的倍數兩側的也可能不是質數
for(
inti= 5;i <=tmp; i+=6 )
if(num %i== 0||num %(i+ 2)==0 )
return
0 ;
//排除所有,剩餘的是質數
return
1 ;
素數的求解方法
就判斷素數而言,事實上是非常簡單的了。根據定義,判斷乙個整數n是否是素數,只需要去判斷在整數區間 2,n 1 之內,是否具有某個數m,使得n m 0。可以這麼寫 int isprime int n return 1 事實上,這個演算法是o n 的,感覺是很快了,但是依舊無法滿足需求。所以有乙個演算法...
素數求解的的幾種簡單方法
問題 列印出100到200之間的素數 方法一 素數n就是除了1和它本身之外沒有任何因子的數,所以要求素數我們很容易想到從2到n 1去試除,如果能除盡說明它不是素數,這個時候就接著判斷下乙個數也就是下面的這種 上結果圖 方法二 方法一是可以做出來,但是要試的因子太多了有點。我們可以想到如果n有除了它本...
關於素數的求解
質數 prime number 又稱素數,有無限個。乙個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的 因數。求解整數n之前的所有素數及總數 include stdio.h include math.h int main if c sqrt i...