编程题目:
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;
}
}