1. 程式人生 > 其它 >java 判斷素數_每日一課 | 在Java中確定素數

java 判斷素數_每日一課 | 在Java中確定素數

技術標籤:java 判斷素數java判斷素數java求素數java素數程式碼使用函式求素數和怎樣用函式判斷陣列中的數是否為素數

e3f53e152472e5fac8bf09674cc004c4.gif

在數學和安全性中,一個非常重要的問題是判斷數字是否為質數。在加密密碼時,這非常有用。在本教程中,您將學習在簡單情況下如何查詢數字是否為質數。

瑣事

我們瞭解到,如果數字唯一的除數是1及其本身,那麼它們就是質數。瑣碎地,我們可以檢查從1到其自身(不包括在內)的每個整數,並測試它是否均分。

例如,可能會想執行此演算法:

//checks whether an int is prime or not.booleanisPrime(intn){for(inti=2;iif(n%i==0)returnfalse;

}returntrue;
}

乍一看,這似乎還不錯,但是我們可以使其更快-更快。考慮一下,如果2除以某個整數n,那麼(n / 2)也將n除。這表明我們不必嘗試2到n之間的所有整數。現在我們可以修改演算法:

//checks whether an int is prime or not.booleanisPrime(intn){for(inti=2;2*iif(n%i==0)returnfalse;
}returntrue;
}

通過一些更有效的編碼,我們注意到您實際上只需要向上求n的平方根,因為如果您列出一個數字的所有因子,則平方根將始終位於中間(如果碰巧不是整數,我們還是可以的,只是可能過於近似,但我們的程式碼仍然可以使用)。

最後,我們知道2是“奇數”素數-它恰好是唯一的偶數素數。因此,我們只需要單獨檢查2,然後遍歷奇數直到n的平方根即可。最後,我們的程式碼類似於:

//checks whether an int is prime or not.booleanisPrime(intn){//check if n is a multiple of 2if(n%2==0) returnfalse;//if not, then just check the oddsfor(inti=3;i*i<=n;i+=2) {if(n%i==0)returnfalse;
}returntrue;
}

如您所見,我們已經從檢查每個整數(最多檢查n個以發現一個數為質數)到檢查整數的一半直至平方根(實際上是奇數)。這是一個巨大的改進,尤其是考慮到數量很大時。

重複次數

假設您編寫了一個程式,要求您檢查是否有很多素數;不只是一次 即使我們上面的程式針對該演算法進行了高度優化,也存在另一種特別適合這種情況的方式:Prime Sieve。

這是基本思想:

  1. 假設每個大於或等於2的整數均為質數。

  2. 從列表的開頭開始,如果數字是質數,請從列表中減去該數字的每一個倍數。他們不是素數。

  3. 轉到下一個數字(如果已被劃掉),請跳過它-它不是素數。如果未加倍,則必須是質數,加倍。

  4. 重複

讓我們看看這意味著什麼。考慮以下列表:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

2是質數...相乘是倍數。現在,我們的列表如下所示:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18歲 19 20 …

您會看到為什麼2是唯一的質數。現在用3進行處理,我們將6(已被刪除),9、12(已被刪除),15等刪除。最終,您的列表將如下所示:2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18歲 19 20 …

我們的素數就是剩下的素數:(2,3,5,7,11,13,17,19,23,29,…)。在程式碼中,您可能希望以陣列的形式跟蹤此列表。這意味著您將要遍歷n個數字來設定此“篩子”,但在重複呼叫該函式時會加以彌補,因為無論數字是否為質數,該函式都會返回一個瞬時值。這就是它的樣子。當然,您可以根據自己的需要進行編輯:

importjava.util.Arrays;//global array just to keep track of it in this example,//but you can easily do this within another function.// will contain true or false values for the first 10,000 integersboolean[] primes=newboolean[10000];//set up the primesievepublicvoidfillSieve(){
Arrays.fill(primes,true); // assume all integers are prime.
primes[0]=primes[1]=false; // we know 0 and 1 are not prime.for(inti=2;i//if the number is prime,//then go through all its multiples and make their values false.if(primes[i]) {for(intj=2;i*jprimes[i*j]=false;
}
}
}
}publicbooleanisPrime(intn){returnprimes[n]; //simple, huh?
}

翻譯自: https://mkyong.com/java/how-to-determine-a-prime-number-in-java/

推薦閱讀--

每日一課 | Java 中如何將 ArrayList 與 HashSet 互相轉換?

每日一課 | JavaScript基礎

每日一課 | JavaScript的事件

每日一課 | JavaScript的內建物件

ef82af6b-932b-eb11-8da9-e4434bdf6706.svg

球分享

f182af6b-932b-eb11-8da9-e4434bdf6706.svg

球點贊

5e99bc4ef4b269891ad1b0d68ea8d6f8.gif

球在看