/*
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);
}
}