java基础算法之求两个数的最大公约数和最小公倍数

这篇博客介绍了如何使用Java编写程序来计算两个正整数的最大公约数(GCD)和最小公倍数(LCM)。通过Scanner获取用户输入,将字符串转换为整数,然后调用getMaxDivisor和getMinMultiple方法进行计算并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package mr.y.arithmetic;

import java.util.Scanner;

/**
*
*输入两个正整数m和n,求其最大公约数和最小公倍数
*
*/
public class TestMaxAndMin {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(“请输入两个数字,中间请用英文逗号隔开 :”);
String next = sc.next();
String[] ns = next.split(“,”);
int m=0, n=0;
try{
m = Integer.parseInt(ns[0]);
n = Integer.parseInt(ns[1]);
}catch(Exception e){
e = new RuntimeException(“输入有误 请检查是否合法!”);
e.printStackTrace();
}
System.out.println(“最大公约数”+getMaxDivisor(m, n));
System.out.println(“最小公倍数”+getMinMultiple(m, n));
}

/**
 * 这里介绍一下辗转相除法, 求m,n的最大公约数的步骤
 * 1. m%n = r;
 * 2. 判断r是否为0;
 * 3. 如果为0 那么n就是他们的最大公约数
 * 4. 如果不为0, 那么 m=n, n=r, 然后返回第一步。
 * 
 * 上面的内容 写成代码 就是下面的程序。
 * 
 * 请允许我介绍一下 辗转相除法的原理 (注:以下 除法 是 算数除法 不是 java除法)
 * 假设  m/n = q...r  即 m除以n 商为q余数为r 
 * 这样可以得出 r = m - nq;
 * 假如  m,n有最大的公约数  t  那么 m = at;  n = bt(a,b>0)
 * 所以  r = at - btq = (a-bq)t
 * 因为 a为正整数, bq 也是正整数  所以 a-bq 同样是正整数 所以  m, n, r 有相同的最大公约数 t
 * 所以 接下来就顺理成章了  m = n ; n = r
 * 继续  m/n = q1....r1 如果 余数不为0 就继续以上操作
 * 因为 m n 和r 有相同的最大公约数t 所以 r的最小值就是t,当r=t的时候,继续操作  
 * m/n = xt/t = x....0  此时余数为0时  n的值就是我们所求的 最大公约数
 * 
 */
//辗转相除法获取最大公约数
public static int getMaxDivisor(int m, int n){
    int r = m%n;
    if(r==0){
        return n;
    }else{
        m = n;
        n = r;
        return getMaxDivisor(m, n);
    // return getMaxDivisor(n,r);  如果你理解了 写成这样就好了
    }
}

//获取最小公倍数(m*n/最大公约数)
public static int getMinMultiple(int m, int n){
    return m*n/getMaxDivisor(m, n);
}
//辗转相减法 求最大公约数(原理同 辗转相除法 自己推一下吧,很有意思)
public static int getMaxDivisor1(int m , int n){
    int deu = 0;
    if(m>n){
        deu = m - n;
        return getMaxDivisor1(deu, n);
    }else if(m<n){
        deu = n - m;
        return getMaxDivisor1(m, deu);
    }else if(m==n){
        return m;
    }
    return 0;
}

}
/**
* 程序结束, 如果有误, 还望大神指导 时间:2017年1月12日17:04:37
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值