标签:组合 最小公倍数 最大的 ati code 最大公约数 sys tin 大于
输入两个正整数,求其最大公约数和最小公倍数。
每行输入两个正整数 a, b (1≤a,b≤104),空格隔开。
输出两行,分别是 a, b 的最大公约数和最小公倍数。
package javaexam;
import java.util.Scanner;
public class CommonDM
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int a = input.nextInt();
int b = input.nextInt();
// 求a、b的最大公约数
System.out.println(fun(a, b));
// 最小公倍数 = 两整数的乘积 / 最大公约数
System.out.println(a * b / fun(a, b));
}
static int fun(int m, int n)
{
// 辗转相除法求最大公约数
if(m % n == 0)
return n;
else
return fun(n, m % n);
}
}
2 3
1
6
假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z,
那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除。
(m和n可取任意整数)
对于辗转相除法来说,思路就是:若x>y,设x/y=n余c,则x能表示成x=ny+c的形式,将ny移
到左边就是x-ny=c,由于一般形式的mx±ny能被z整除,所以等号左边的x-ny(作为mx±ny的
一个特例)就能被z整除,即x除y的余数c也能被z整除。
z是x和y的公约数,并且是最大公约数:
由于z=mx±ny,所以x,y的任意公因数都整除z,所以z是最大的。
程序中a和b的输入是,大小顺序无关。即:
case 1 :
2 3
1
6
case 2 :
3 2
1
6
结果相同。
原因:fun()函数里已经考虑做了case 2 的情况。当 a 大于 b 时,交换 a 和 b 的值。即:fun()函数里交换 m 和 n 的值。最后都是 较大的数 % 较小的数
。
标签:组合 最小公倍数 最大的 ati code 最大公约数 sys tin 大于
原文地址:https://www.cnblogs.com/narisu/p/9057902.html