51nod 1012 最小公倍数LCM

题目链接:http://class.51nod.com/Challenge/Problem.html#problemId=1012

一、题目描述

输入2个正整数A,B,求A与B的最小公倍数。

输入
2个数A,B,中间用空格隔开。(1<= A,B <= 10^9)
输出
输出A与B的最小公倍数。
输入样例
30 105
输出样例
210

二、思路描述

思路一:

最小公倍数是这么求的:(这个思路建议笔算时使用)
把12和18同时除以一个数,把除完的12称为x,把除完的18称为y。我们要一直除到x和y互质
这时把12和18刚才除以的所有数字乘起来就得到了最大公约数(12和18的最大公约数是6)
最大公约数再乘上x和y(这时x和y互质)就是最小公倍数了(12和18的最小公倍数是36)

思路二:

这道题还可以借助一个公式来求最小公倍数(这个思路建议编程序时使用)

公式:x*y = gcd(x,y)*lcm(x,y)

这个公式可以被证明:

我们发现12和18都分别是6(12和18的最大公约数)的x倍和y倍
6*2(x)得到12,12*3(y)得到36,36*6得到216。12*18也是216。
这就证明了这个公式:x*y = gcd(x,y)*lcm(x,y)

代码:(这里只显示思路二的代码)

#include<cstdio>
#include<iostream>
using namespace std;

long long gcd(long long x, long long y){//要求x和y的最大公约数 
    while(x % y){
        long long tmp = x % y;
        x = y;
        y = tmp;
    }
    return y;
}

long long lcm(long long x, long long y){
    return x*y / gcd(x,y);//我们利用这个公式求出最小公倍数 
}

int main(){
    long long a,b;
    cin >> a >> b;
    cout << lcm(a,b); 
    return 0;
}
原文地址:https://www.cnblogs.com/elisa02/p/12786683.html