题解 | #求最小公倍数#

求最小公倍数

https://www.nowcoder.com/practice/22948c2cad484e0291350abad86136c3

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String a;
        try {
            a = in.readLine();
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
        int[] num = new int[2];
        int k, numA, numB;
        parse(a, num);
        if (num[0] > num[1]) {
            numA = num[0];
            numB = num[1];
        } else {
            numA = num[1];
            numB = num[0];
        }
        k = maxCommDiv(numA, numB);
        System.out.print(numA * numB / k + "\n");
    }

    static void parse(String a, int[] num) {
        int i = 0, l = a.length(), n = 0;
        char[] chrAy = new char[l];
        a.getChars(0, l, chrAy, 0);
        while (i < l) {
            if (chrAy[i] == ' ') {
                num[0] = n;
                n = 0;
            } else {
                n *= 10;
                n += chrAy[i] - '0';
            }
            i++;
        }
        num[1] = n;
    }

    static int maxCommDiv(int x, int y) {
        int k = 0;
        if (y == 0)
            k = x;
        else
            k = maxCommDiv(y, x % y);
        return k;
    }
    // a和b的最大公约数是k,则a=ik,b=jk,且i和j中已经没有公因子,i>j
    // a/b=ki/kj=i/j=(jm+n)/j=m+n/j,m是正整数,n/j是真分数,n<j
    // a=b(m+n/j)=jk(m+n/j)=jkm+kn=bm+kn,kn<kj=b
    // a%b=kn<b,b=jk,所以b=jk和a%b=nk的最大公约数k,与a和b的最大公约数相等
    // gcb(x,y)中,保证大数在前,因为a>b,b>a%b,所以分别将a和b放在前面
    // 当n=1时,x=jk,y=1*k=k,较小数就是最大公约数

}

全部评论

相关推荐

WillingLing:查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务