超級詳細的基礎算法和數據結構合集:
https://blog.csdn.net/GD_ONE/article/details/104061907
摘要
本文主要講解如何判斷一個數是質數,和如何對一個數分解質因數。本文是很基礎的也很重要的數學知識。
質數
質數又稱爲素數,是指大於1的並且除了1和它本身外,沒有其他因數的自然數。
判斷一個數是否是質數
假設該數爲n, 我們只需要判斷[2, ]內是否有n的因子。如果有,則n爲合數,否則,n爲質數。
public static Boolean isprime(int n){
if(n == 1) return false;
for(int i = 2; i <= n / i; i++){
if(n % i == 0){
return false;
}
}
return true;
}
注意:以上代碼中,for循環的結束條件是 i <= n/i
,相當於i <= sqrt(n)
,兩種寫法都可以,只不過調用sqrt()函數會慢一些,因爲for循環每次循環都會調用該函數。另外,不能寫成i * i <= n
因爲當n很接近int的最大值時,i*i可能會溢出。
分解質因數
根據算術基本定理又稱唯一分解定理,對於任何一個合數, 我們都可以用幾個質數的冪的乘積來表示。
即: ,
如:
接下來我們利用這個公式分解質因數。
設一個質數爲p.如果n%p == 0
,那麼p就是n的一個質因數,接下來就是求p的指數,我們讓n = n/p
, 這樣就從n中剔除了一個p,接着重複上述兩步,直到n%p != 0
代碼:
public static void prime(int n){
for(int i = 2; i <= n / i; i++){
int a = 0, b = 0;
while(n % i == 0){
a = i;
n /= i;
b++;
}
if(b > 0)
System.out.println(a + " " + b);
}
if(n > 1) System.out.println(n + " " + 1);
}
注意:以上代碼中for循環的結束條件也是i <= n / i
,因爲根據公式,最多隻可能有一個質因數是大於,因爲有兩個的話,乘積肯定超過n了。所以當for循環結束後判斷n是否大於1,如果大於就說明有一個大於的質因數。