题目:求两个正整数的最大公约数和最小公倍数。

基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。

提高要求:1.三种以上算法解决两个正整数最大公约数问题。

                  2.求3个正整数的最大公约数和最小公倍数。

 

import java.util.Scanner;

/**
 * 求两个正整数的最大公约数和最小公倍数
 * @author 123
 *
 */
public class Test42 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入两个整数:");
        int m = sc.nextInt();
        int n = sc.nextInt();
        System.out.println(m + "和" + n + "的最大公约数1:" + GCD1(m, n));
        System.out.println(m + "和" + n + "的最大公约数2:" + GCD2(m, n));
        System.out.println(m + "和" + n + "的最大公约数3:" + GCD3(m, n));
        System.out.println(m + "和" + n + "的最大公约数4:" + GCD4(m, n));
        System.out.println("-------------------------------------");
        System.out.println(m + "和" + n + "的最小公倍数1:" + LCM1(m, n));
        System.out.println(m + "和" + n + "的最小公倍数2:" + LCM2(m, n));
        System.out.println(m + "和" + n + "的最小公倍数3:" + LCM3(m, n));
    }

    /*
     * 最大公约数:辗转相除法
     * 较大数除以较小数,若余数不为0,则余数作为除数,上次的除数作为被除数,
     * 继续相除,直到余数为0,此时的除数即为最大公约数
     */
    public static int GCD1(int m, int n) {
        if (m < n) {
            int temp = m;
            m = n;
            n = temp;
        }
        while (m % n != 0) {
            int temp = m % n;
            m = n;
            n = temp;
        }
        return n;
    }

    /*
     * 最大公约数:递归法
     * 每次用上次的除数除以上一次余数,如果余数为0。那么除数就是最大公约数
     */
    public static int GCD2(int m, int n) {
        if (m < n) {
            int temp = m;
            m = n;
            n = temp;
        }
        if (m % n == 0) {
            return n;
        }
        return GCD2(n, m % n);
    }

    /*
     * 最大公约数:相减法
     * 较大数减去较小数,若减数和差相等,则差为最大公约数,否则把差和减数作比较,
     * 两者中较大的数减去较小的数,如此循环
     */
    public static int GCD3(int m, int n) {
        while (m != n) {
            if (m > n) {
                m = m - n;
            } else {
                n = n - m;
            }
        }
        return m;
    }
 
    /*
     * 最大公约数:穷举法
     * 1.z=m(m或n)
     * 2.若m,n能同时被z整除,则z即为最大公约数,结束
     * 3.z--,再回去执行2
     */
    public static int GCD4(int m, int n) {
        int z;
        for (z = m; z > 0; z--) {
            if (m % z == 0 && n % z == 0) {
                break;
            }
        }
        return z;
    }
    
    /*
     * 最小公倍数:辗转相除法
     * 用辗转相除法算出最大公约数后,用两个整数之积除以最大公约数即为最小公倍数。
     */
    public static int LCM1(int m,int n){
        return m*n/GCD1(m,n);
    }
    
    /*
     * 最小公倍数:穷举法
     * 始终使m为较小小数,依次往上加m,看每个数是否能够整除两个整数,所遇到的第一个数即为最小公倍数。 
     */
    public static int LCM2(int m, int n) {
        if (m > n) {
            int temp = m;
            m = n;
            n = temp;
        }
        for (int i = m; i <= m * n; i++) {
            if (i % m == 0 && i % n == 0) {
                return i;
            }
        }
        return m;
    }
    
    /*
     * 最小公倍数
     * 1.定义i=1;累加,若i*n%m为0,则n*i为最小公倍数,
     * 2.否则i+1,继续执行1,
     * 3.若i=m,则m*n为最小公倍数
     */
    public static int LCM3(int m, int n) {
        if (m > n)
            return LCM1(n, m);
        int i = 1;
        while (i++ < m) {
            if (n * i % m == 0)
                return n * i;
        }
        return m * n;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值