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; }