【程式6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
阿新 • • 發佈:2019-01-04
/* 2017年3月2日15:10:11 java基礎50道經典練習題 例6 Author:ZJY(&&) Purpose:最大公約數和最小公倍數的應用 最大公約數:把每個數分別分解質因數,再把各數中的全部公有質 因數提取出來連乘,所得的積就是這幾個數的最大公約數。 例如:求24和60的最大公約數,先分解質因數,得24=2×2×2×3, 60=2×2×3×5,24與60的全部公有的質因數是2、2、3,它們的積是 2×2×3=12,所以,(24,60)=12。 最小公倍數: 把各數中的全部公有的質因數和獨有的質因數提取出來 連乘,所得的積就是這幾個數的最小公倍數。 例如:求6和15的最小公倍數。先分解質因數,得6=2×3,15=3×5, 6和15的全部公有的質因數是3,6獨有質因數是2,15獨有的質因數是5, 2×3×5=30。 【程式6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 程式分析:利用輾除法。 */ public class ProgramNo6_1 { public static void main(String[] args) { int num1 = 0, num2 = 0; try { num1 = Integer.parseInt(args[0]); num2 = Integer.parseInt(args[1]); }catch(ArrayIndexOutOfBoundsException e) { System.out.print("請輸出需要計算最大公約數的兩個數: "); return; } int maxConvention = maxConventionNum(num1, num2); System.out.println(num1 + "和" + num2 + "的最大公約數是: " + maxConvention); int minMultiple = minMultipleNum(num1, num2); System.out.println(num1 + "和" + num2 + "的最小公倍數是: " + minMultiple); } private static int maxConventionNum(int num1, int num2) { int maxConvention = 1; int min = ((num1 > num2)? num2: num1); for (int i=2; i<min+1; i++) { while ((0 == num1%i)&&(0 == num2%i)) { num1 /= i; num2 /= i; min = ((num1 > num2)? num2: num1); maxConvention *= i; } } return maxConvention; } private static int minMultipleNum(int num1, int num2) { int maxConvention = maxConventionNum(num1, num2); return (num1*num2/maxConvention); //最小公倍數等於兩數的乘積除以最大公約數 //因為兩數同時除以2以上的質數,直到兩個數的商互為質數;它們所有的共同約數乘積就是 //最大公約數,它們所有約數的乘積再乘以商的積就是最小公倍數;如:12 = 2*2*3; //18 = 2*3*3; 它們公共的約數為2*3所以最大公約數為6;最小公倍數當兩數約數一樣,只取 //一個,如12個18都是2*3,所以只取一個再乘以各自的商,即2*3*3*2 = 36;所以最小公倍數 //可以等於12*18/最大公約數,就是除以多乘的2*3; } //方法二: //private static int minMultipleNum(int num1, int num2) { //int max = 0; //for (max=1; ; max++) { //if((0 == max%num1)&&(0 == max%num2)) //break; //} //return max; //} }
/* 2017年3月2日15:29:25 java基礎50道經典練習題 例6 Author:ZJY(&&) Purpose:最大公約數和最小公倍數的應用 */ public class ProgramNo6_2 { public static void main(String[] args) { int num1 = 0, num2 = 0; try { num1 = Integer.parseInt(args[0]); num2 = Integer.parseInt(args[1]); }catch(ArrayIndexOutOfBoundsException e) { System.out.print("輸入有誤!!"); return; } max_minNum(num1, num2); } //輾除法 private static void max_minNum(int num1, int num2) { int temp = 0, yshu = 0, bshu = 0; bshu = num1*num2; if(num1 > num2) { temp = num2; num2 = num1; num1 = temp; } //兩個數相除,取最小數和餘數再相除,直到餘數為零,此時的被除數為最大公約數 while (num1 != 0) { temp = num2%num1; num2 = num1; num1 = temp; } yshu = num2; bshu = bshu/yshu; //最小公倍數的兩數的乘積除以最大公約數 System.out.println(num1 + "和" + num2 + "的最大公約數是: " + yshu); System.out.println(num1 + "和" + num2 + "的最小公倍數是: " + bshu); } }