1. 程式人生 > >java:演算法 - 正整數分解質因數

java:演算法 - 正整數分解質因數

題目:將一個正整數分解質因數。例如:輸入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()以下的正整數。