码迷,mamicode.com
首页 > 其他好文 > 详细

公约公倍数

时间:2018-05-18 21:16:52      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:组合   最小公倍数   最大的   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!