轉載自 這裡
說明 :
最大公因數(GCD)可以使用輾轉相除法來求,最小公倍數(LCM)則由這個公式來求 :
而因式分解則涉及質數表的建立, 可以參考 Eratosthenes 篩選求質數
解法 :
最大公因數可以使用輾轉相除法求解, 而因式分解需求出小於該數的所有質數,並試試看是不是可以整除並將可以整除的質數列入因數表裡.
實作 :
- 最大公因數/最小公倍數
透過輾轉相除法求出最大公因數, 再透過最大公因數求最小公倍數 :
- 因數分解
這裡透過類別 Prime 求出某一數以內的所有質數表, 再透過類別 Factor 求出該數的質因數分解.
說明 :
最大公因數(GCD)可以使用輾轉相除法來求,最小公倍數(LCM)則由這個公式來求 :
GCD * LCM = 兩數乘積
而因式分解則涉及質數表的建立, 可以參考 Eratosthenes 篩選求質數
解法 :
最大公因數可以使用輾轉相除法求解, 而因式分解需求出小於該數的所有質數,並試試看是不是可以整除並將可以整除的質數列入因數表裡.
實作 :
- 最大公因數/最小公倍數
透過輾轉相除法求出最大公因數, 再透過最大公因數求最小公倍數 :
- GCDPNumber.java :
- package alg.maths;
- public class GCDPNumber {
- public static int gcd(int m, int n)
- {
- if(n==0) return m;
- else return gcd(n, m%n);
- }
- public static int lcm(int m, int n){return m*n/gcd(m,n);}
- public static void main(String[] args) {
- System.out.println("GCD of (10, 4) = " + gcd(10, 4));
- System.out.println("LCM of (10, 4) = " + lcm(10, 4));
- }
- }
- 因數分解
這裡透過類別 Prime 求出某一數以內的所有質數表, 再透過類別 Factor 求出該數的質因數分解.
- Prime.java :
- package alg.maths;
- import java.util.ArrayList;
- import java.util.List;
- public class Prime {
- public static List
findPrimes( int n)- {
- List
pml = new ArrayList (); - boolean pm[] = new boolean[n+1];
- for(int i=0; i
true; - int j=0;
- for(int i=2; i
- {
- if(pm[i])
- {
- j=2;
- while((j*i)<=n)
- {
- pm[j*i] = false;
- j++;
- }
- }
- }
- for(int i=2; i
if(pm[i]) pml.add(i); - return pml;
- }
- }
- Factor.java :
- package alg.maths;
- import java.util.ArrayList;
- import java.util.List;
- public class Factor {
- public static List
factor( int n) {- int num = n;
- List
primes = Prime.findPrimes(num); - List
list = new ArrayList (); - for(int i = 0; primes.get(i) <= Math.sqrt(num);) {
- if(num % primes.get(i) == 0) {
- list.add(primes.get(i));
- num /= primes.get(i);
- }
- else {
- i++;
- }
- }
- list.add(num);
- return list;
- }
- public static void main(String[] args) {
- for(Integer f : Factor.factor(100)) {
- System.out.print(f + " ");
- }
- }
- }
沒有留言:
張貼留言