【JAVA练习题】五、输入两个正整数m和n,求其最大公约数和最小公倍数

题目

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

分析

首先,要求最大公约数使用辗转相除法得到

辗转相除法:
设两数为a、b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=k…r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc

第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c

第三步:根据第二步结果可知c也是r的因数

第四步:可以断定m-kn与n互质(假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾),因此c也是b与r的最大公约数。

从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

证毕。

以上步骤的操作是建立在刚开始时r≠0的基础之上的。即m与n亦互质。

最大公约数和最小公倍数的关系

两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。
分析:假设两个数为 a和b,他们的最大公约数是a/c,
那么他们的最小公倍数为 (a/c) * a/(a/c) * b/(a/c)。
化简后得: bc
所以 最大公约数 乘以 最小公倍数 = (a/c) * (b
c) =a*b

package com.practice.java;


import java.util.Scanner;

/**
 * @author CT
 * @create 2021-05-27 19:19
 * @data 2021/5/27 - 19:19
 */
public class Greatest_common_divisor_least_common_multiple {
    /**
     * 【程序5】
     * 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
     */


    public static int maxCommonDivisor1(int num1,int num2){
        int result = 1;
        int tmp = num1>num2? num2 :num1;
        for (int i = 2; i <= tmp; i++) {
            if(num1%i == 0 && num2%i == 0){
                result = i*result;
                num1 = num1/i;
                num2 = num2/i;
                i=1;
            }
        }
        return result;
    }

    public static int maxCommonDivisor(int num1,int num2){
        int tmp = num1<num2?num1:num2;
        int result = 1;
        //A ? B : C ,意思就是如果A为真执行B,否则执行C
        //辗转相除法
        //  定义:所谓辗转相除法,就是对于给定的两个数,用较大的数除以较小的数。
        //       若余数不为零,则将余数和较小的数构成新的一对数,继续上面的除法,
        //       直到大数被小数除尽,则这时较小的数就是原来两个数的最大公约数。
        for (int i = 2;i<=tmp;i++){
            if (num1%i == 0 && num2%i==0){
                result = i*result;
                num1 = num1/i;
                num2 = num2/i;
                i = 1;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
//        int a =6;
//        int b = 4;
        int maxComDiv = maxCommonDivisor1(a,b);
        int minComMul = (a*b)/maxComDiv;
        System.out.println(maxComDiv+" "+minComMul);
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值