java:演算法 - 正整數分解質因數
阿新 • • 發佈:2019-01-01
題目:將一個正整數分解質因數。例如:輸入90,打印出90 = 2 * 3 * 3 * 5。
程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n<>k,但n能被k整除,則應打印出k的值,並用n除以k的商,作為新的正整數n,重複執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。
注:這裡我把方法都寫在MyMath的工具類裡
/*
*this function returns a list that contains all prime factors
*into which the number of input can be decomposed
*/
public static List<Integer> getPrimeFactors(int number){
List<Integer> primeFactorList = new ArrayList<>();
int loop = number;
for(int i=2;i<=loop;i++){
if(isPrime(i)){
while(!hasRemainder(number,i)){
primeFactorList.add(i);
number = number/i;
}
}
}
return primeFactorList;
}
/*
* check if a number is a prime number or not
*/
public static boolean isPrime(int number){
if(number <= 1)
return false;
if(number == 2 || number ==3)
return true;
//a number more than 5 and not border upon 6 must not be a prime nunber
if( (number % 6 !=1) && (number % 6 != 5))
return false;
//here all numbers are adjacent to 6
for(int i=5;i<=Math.sqrt(number);i=i+6){
if(number%i ==0 || number%(i+2) == 0)
return false;
}
//the rest are all prime numbers
return true;
}
/*
* check if a divided by b has no remainder or not
* @param a
* the number to be divided or the dividend
*@param b
* divisor
*/
public static boolean hasRemainder(int a, int b){
if(a < b || b == 0)
return true;
if(a % b == 0)
return false;
return true;
}
測試:
public static void main(String[] args){
System.out.println(MyMath.getPrimeFactors(35));
System.out.println(MyMath.getPrimeFactors(100));
System.out.println(MyMath.getPrimeFactors(256));
System.out.println(MyMath.getPrimeFactors(101));
}
結果:
[5, 7]
[2, 2, 5, 5]
[2, 2, 2, 2, 2, 2, 2, 2]
[101]
不過,以上函式只能分解Integer.MAX_VALUE()以下的正整數。