編程題目:
43.從控制檯輸入兩個正整數m和n,求其最大公約數和最小公倍數。
示例代碼:
package program.calculation.exercise43;
import java.util.Scanner;
/**
* 43.從控制檯輸入兩個正整數m和n,求其最大公約數和最小公倍數。
* 概念:
* 最大公約數:把每個數分別分解質因數,再把各數中的全部公有質因數提取出來連乘,所得的積就是這幾個數的最大公約數。
* 例如:求24和60的最大公約數,先分解質因數,得24=2×2×2×3,60=2×2×3×5,
* 24與60的全部公有的質因數是2、2、3,它們的積是2×2×3=12,所以,其最大公約數是12。
* 最小公倍數:把各數中的全部公有的質因數和獨有的質因數提取出來連乘,所得的積就是這幾個數的最小公倍數。
* 例如:求6和15的最小公倍數,先分解質因數,得6=2×3,15=3×5,6和15的全部公有的質因數是3,
* 6獨有質因數是 2,15獨有的質因數是5,所以,其最小公倍數是30。
* 技巧:1.兩個數相除,取除數和餘數再相除,直到餘數爲零,此時的被除數爲最大公約數。
* 2.最小公倍數等於兩數的乘積除以最大公約數。
* 因爲兩數同時除以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。
* 分析:利用輾除法。
*/
public class MaxAndMinNumber {
public static void main(String[] args) {
System.out.println("請輸入兩個正整數:");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println("第一種方式(輾除法):");
maxAndMinNum(num1, num2);
System.out.println("第二種方式(定義法):");
int maxConvention = maxConventionNum(num1, num2);
System.out.println("最大公約數是:"+ maxConvention);
int minMultiple = minMultipleNum(num1, num2);
System.out.println("最小公倍數是:"+ minMultiple);
}
//第一種方式(輾除法)
private static void maxAndMinNum(int num1, int num2) {
int maxConvention = 0;//最大公約數
int minMultiple = 0;//最小公倍數
int multiple = num1*num2;//兩數的乘積
//兩個數相除,取除數和餘數再相除,直到餘數爲零,此時的被除數爲最大公約數
while (num1 != 0) {
int temp = num2%num1;
num2 = num1;
num1 = temp;
}
maxConvention = num2;
//最小公倍數等於兩數的乘積除以最大公約數
minMultiple = multiple/maxConvention;
System.out.println("最大公約數是:"+maxConvention);
System.out.println("最小公倍數是:"+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 minMultiple = 0;
for (minMultiple=1; ; minMultiple++) {
if((0 == minMultiple%num1)&&(0 == minMultiple%num2))
break;
}
return minMultiple;*/
//第二種方式
int maxConvention = maxConventionNum(num1, num2);
//最小公倍數等於兩數的乘積除以最大公約數
int minMultiple = (num1*num2/maxConvention);
return minMultiple;
}
}