公约公倍数

问题描述

输入两个正整数,求其最大公约数和最小公倍数。

输入格式

每行输入两个正整数 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 的值。最后都是 较大的数 % 较小的数

猜你喜欢

转载自www.cnblogs.com/narisu/p/9057902.html