高效判別乙個數是不是素數

2021-08-28 02:04:17 字數 732 閱讀 4781

首先看乙個關於質數分布的規律:大於等於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,加快判斷速度,原因是,假如要判定的數為n,則n必定是6x-1或6x+1的形式,對於迴圈中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被6i,6i+2,6i+4整除,則n至少得是乙個偶數,但是6x-1或6x+1的形式明顯是乙個奇數,故不成立;另外,如果n能被6i+3整除,則n至少能被3整除,但是6x能被3整除,故6x-1或6x+1(即n)不可能被3整除,故不成立。綜上,迴圈中只需要考慮6i-1和6i+1的情況,即迴圈的步長可以定為6,每次判斷迴圈變數k和k+2的情況即可,理論上講整體速度應該會是方法(2)的3倍。**如下:

bool isprime_3( int num )

C語言 判斷乙個數是不是素數

判斷素數的方法 素數 指整數在大於1的自然數中,除了1和本身外,無法被其他自然數整除。簡而言之,素數只能被1和它本身整除 方法一 include include pragma warning disable 4996 intmain 方法二 用函式實現 因為因子都是對稱出現,故可將 優化,只需要遍歷...

利用函式判斷乙個數是不是素數

方法一 includeint isprime int x int main void else return 0 int isprime int x for i 2 i方法二 除了2之外,其餘的偶數都不是素數 includeint isprime int x int main void else r...

C語言 判斷乙個數是不是素數

include include int main if l 1 printf d is not a prime number n n else printf d is a prime number n n return0 當然也可以不用判斷因子 但是我本人喜歡在這種判定問題中加入判斷因子 直接對迴圈...