输入两个正整数m和n,求其最大公约数和最小公倍数
错误的代码
public static void main(String[] args) {
// 输入2个正整数,求最大公约数和最小公倍数
// 最大公约数, 1> 第一步控制台输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个正整数:");
int n = sc.nextInt();
System.out.println("请输入第二个正整数:");
int m = sc.nextInt();
// 2> 最大公约数小于等于最小的那个,取m和n中小的那个数
if(n > 0 && m >0) {
int min = (n < m) ? n : m;
for (int i = min; i >= 1; i--) {
if (n % i == 0 && m % i == 0) {
System.out.println("最大公约数为:" + i);
break;
}
}
// 求最小公倍数,最小公倍数一定大于等于最大的那个数,所以最m和n中最大的那个
int max = (n > m) ? n : m;
// 最小公倍数肯定为max的倍数,最大为n和m的乘积
// 所以定义i为max的倍数,i一定小于等于n和m中小的那个,那么肯定也小于大的那个
for (int i = 2; i < max; i++) {
if (max % m == 0 && max % n == 0) {
System.out.println("最小公倍数为:" + max);
break;
} else {
max *= i;
}
}
} else {
System.out.println("输入数据不合法,请输入正整数!");
}
}
正确代码
public static void main(String[] args) {
System.out.println("请输入第一个正整数:");
Scanner in = new Scanner(System.in);
int m = in.nextInt();
System.out.println("请输入第二个正整数:");
int n = in.nextInt();
if (m > 0 && n > 0) {
//最大公约数肯定比二个正整数中最小的一个数
int min = m < n ? m : n;
for (int i = min; i >= 1; i--) {
if (m % i == 0 && n % i == 0) {
System.out.println("最大公约数为:" + i);
//最小公倍数
int b=m*n/i;
System.out.println("最小公倍数为:" + b);
break;
}
}
} else {
System.out.println("你输入的数字不合法!");
}
}
public static void main(String[] args) {
class deff {
public int deff(int x, int y) {
int t;
if (x < y) {
t = x;
x = y;
y = t;
}
while (y != 0) {
if (x == y) {
return x;
} else {
int k = x % y;
x = y;
y = k;
}
}
return x;
}
}
//if判断主要是找到最大值和最小值,因此我们可以用三目运算
//找出最大值和最小值,可以将以上代码,替换成下面注释的
/* class deff {
public int deff(int x, int y) {
int min=x<y?x:y;
int max=x>y?x:y;
while (min!= 0) {
if (max == min) {
return max;
} else {
int k = max % min;
max = min;
min = k;
}
}
return max;
}
}*/
int a, b, m;
Scanner s = new Scanner(System.in);
System.out.println("输入一个整数: ");
a = s.nextInt();
System.out.println("再输入一个整数: ");
b = s.nextInt();
deff cd = new deff();
//最大公约数
m = cd.deff(a, b);
//最小公倍数
int n=a*b/m;
System.out.println("最大公约数:"+m);
System.out.println("最小公倍数;"+n);
}
原因分析:最小公倍数是最大数的倍数,如果一味的只用最大数的倍数,会导致,所求最小公倍数,有可能是手算的,二倍或者几倍,因此不是最小公倍数。
数甲和数乙,且它们的最大公约数是A。则有数甲=aA,数乙=bA。可以相见,a和b一定是互质的。数甲×数乙=aA×bA=abA²。abA²÷A=abA,abA是数甲和数乙的最小公倍数。
测试案例
30和45 最大公约数15 最小公倍数90
错误代码结果展示:
正确代码结果展示:
28和45 最大公约数1 最小公倍数1260
错误代码结果展示:
正确代码结果展示:
48和36 最大公约数12 最小公倍数144
错误代码结果展示:
正确代码结果展示:
26和65 最大公约数13 最小公倍数130