判斷乙個數是不是質數 素數 ,3種方式介紹

2021-09-26 04:36:50 字數 1309 閱讀 8759

本文參考博文判斷乙個數是不是質數(素數),3種方式介紹,原文章解釋的已經很詳細,本問增加部分博主自己的理解。

質數:質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。特別的0,1不是質數。

bool isprime(int n)

for(int i=2; i直接從2遍歷到n-1,判斷是否存在i,i大於等於2,小於等於n-1,且i為n的乙個因數,若存在,那麼n不是質數,若不存在,那麼n是質數。

bool isprime(int n)

int s = (int)sqrt(n);

for(int i=2; i<=s; i++)

}return true;

}

其實可以看出,i只要遍歷到根號下n即可。

因為倘若n為合數,存在乙個因數y大於1且不等於n,那麼n一定小於等於根號下n,沒必要遍歷到n-1。

bool isprime(int n)

if(n%6!=1 && n%6!=5)

int s = (int)sqrt(n);

for(int i=5; i<=s; i+=6)

}return true;

}

繼續分析可以發現,所有質數(除了2)總是等於6x-1或者6x+1,其中x為大於等於1的自然數。即所有質數(除了2)對6求餘數,餘數總是等於5或者1。(若質數為6x-1,那麼餘數為5,若質數為6x+1那麼餘數為1)。證明如下:

首先 6x 肯定不是質數,因為它能被 6 整除;其次 6x+2 肯定也不是質數,因為它還能被2整除;依次類推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那麼,就只有 6x+1 和 6x+5 (即等同於6x-1) 可能是質數了。

在**中,首先判斷小於等於3時的情況,若為0、1返回false;為2、3返回true;

然後判斷該數是否等於6x-1或者6x+1,若不等於,那麼一定不是質數,如果等於,那麼不一定是質數,需要繼續判斷。

到現在已經保證該數等於6x-1或者6x+1,如果這個數是合數,那麼他的因數一定不是2、3、4、6。它的因數只可能是6x+1或者6x+5(6x+5與6x-1相同),即如果這個數是合數,那麼他的因數只能是5(6x-1)、7(6x+1)、11(6x-1)、13(6x+1)、、、、、sqrt(n)。那麼與方法二類似的,可以得到需要遍歷兩次,分別為:遍歷的初始值為5,終值為sqrt(n),步長為6。遍歷的初始值為7,終值為sqrt(n),步長為6。這連個遍歷可以寫在一起,即**中的:

for(int i=5; i<=s; i+=6)

}

判斷乙個數是不是質數 素數 ,3種方式介紹

質數又稱素數。乙個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數 否則稱為合數。0和1既不是質數也不是合數,最小的質數是2 二 方法介紹 1.最直觀,但效率最低的寫法 public static boolean isprime int n for int i 2 i n i re...

python中判斷乙個數是不是質數

首先說明,內容結合了其他人的程式設計想法 和其他學習平台學習的思路,本人只是將解法記錄下來方便自己之後查閱。由於本人學藝不精,如果有錯誤還請大家見諒並指出,謝謝。質數是除了1和它本身再無其他的因數,例如5。在數學上與質數相對的是合數。其中1既不是質數也不是合數。num int input if nu...

檢查乙個數是不是質數

1 num int input 請輸入乙個自然數 2 nums 3for i in range 1,num 4for j in range 1,num 6if num in nums 78 print 不是質數 format num 9 10else 11print 是質數 format num 函...