小白總結的求素數方法

2021-10-12 04:33:31 字數 1772 閱讀 6504

判斷素數在演算法問題中經常遇到,這裡編者小白小結了幾種求素數的常用方法。

【列舉法】

首先,第一種最常用的方法,便是從1-n逐個判斷是否為素數,即逐個判斷乙個數是否能被2~n-1整除,利用跳出迴圈時除數與被除數是否相等判斷是否為素數。

#include

intmain()

return0;

}

基於該種方法,我們可以對其做一些改進:

1.若乙個數n不能被2~√n整除,該數即為素數 ;

2.除2之外的偶數均不為素數。

#include

#include

intmain()

return0;

}

【篩法】

接下來第二種方法就是篩法,篩法的基本思路如下:

(1)挖去1:

(2)用下乙個未被挖去的數m去除m後面各數,把m的倍數挖掉;

(3)檢查m是否小於n的開方的整數部分,如果是,則返回(2)繼續執行,否則就結束;

(4)剩下的數就是素數。

附上一張幫助大家理解

//篩法求素數:素數的倍數一定不是素數

#include

#include

intmain()

for(i=

1;i<=n;i++)if

(a[i]!=0

)//剩下的數即為素數

printf

("%d\n"

,a[i]);

return0;

}

【六素數法】

證明如下:

n-1與n+1是素數,也即n−1和n+1是奇數

∴n是偶數,n是2的倍數。

設n不是3的倍數,即n=3k+1或n=3k+2。

(i)當n=3k+1時,那麼n−1=3k,已經與n−1是素數矛盾。

(ii)當n=3k+2時,那麼n+1=3(k+1),已經與n+1是素數矛盾。

綜上所述,n是3的倍數。

∵n既是2的倍數,又是3的倍數

∴n是6的倍數。

基於此,我們可以把6x(x>=1)附近的數用以下方式表示:

......(6x−1),6x,6x+1,2(3x+1),3(2x+1),2(3x+2),6x+5,6(x+1)......
不在6x兩側的數為:2(3x+1),3(2x+1),2(3x+2),顯然它們一定不是素數,所以素數出現在6x的兩側,但在6x兩側的數不一定是素數。(即n>=5時,如果n為素數,則n%6= =1||n%6= =5)

有了以上的理論基礎,我們便可以寫最後一種方法(六素數法):首先不在6x左右的數2特殊處理,3單獨處理,接下來只要判斷6x兩側的數是否為素數。因為合數總是可以寫成素數的乘積,那麼我們直接用n去除以素數就可以達到很好地優化目的。而素數一定是6x兩側的數,且6x兩側的數是大於素數的集合,因此可以用n除以6x兩側的數,即if(n%i==0||n%(i+2)==0)時,不是素數。

//六素數法

#include

#include

intmain()

if(flag==0)

printf

("%d\n"

,i);

}return0;

}

求素數的方法

如何求取素數呢?其實很簡單,思想呢就是找出所有整數p然後,刪去2 p,3 p。就好了?大該怎麼做呢?我們來真實資料 100以內有25個素數,10 3有168個,10 4有1229個,10 5有9592個,10 6有78498個,10 7有664579個 我們就有例項說明一下 0 n的所有素數 inc...

求素數,求因數的方法

素數的定義是 自己總結 只能被1和自身整除的數。注意 1.最小的素數是2。2.1 既不是素數也不是合數。3.素數不包括負數。一般的求解素數的方法是 include includeusing namespace std bool isprime int n int main void filterpr...

求質數 素數 的方法

質數是數學重要的一環,所謂質數,就是除了1和它本身外不存在任何因子的數。以下整理了一下c語言中質數的求法。問題 輸入乙個正整數n n 2 求不大於n的全部質數 方法一 迴圈法 思路 判斷乙個數n是不是質數,可以用2到 n之間的所有整數去除n,如果都不能整除,那麼n是質數。設計迴圈巢狀時盡量跳過一些不...