求最小公倍数
- 时间限制:1秒
- 空间限制:32768K
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
- 输入:两个正整数 A 和 B。
- 输出:A 和 B 的最小公倍数。
例如,输入 5 7
,输出 35
。
分析
我们知道,两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。如果 [a, b] 表示 a 和 b 的最小公倍数,(a, b) 表示 a 和 b 的最大公约数,那么:
也就是说,我们可以通过求两个数的最大公约数来得到最小公倍数。而常见的求最大公约数的方法有:质因数分解法、短除法、辗转相除法、更相减损法。
我们这里采用辗转相除法来实现,辗转相除法又称欧几里得算法(Euclidean algorithm)。它基于一个定理:两个正整数 a 和 b(a 大于 b),它们的最大公约数等于 a 除以 b 的余数 c 和较小数 b 之间的最大公约数。
C 代码实现
#include <stdio.h>
typedef unsigned int uint;
/* greatest common divsor */
uint gcd(uint a, uint b)
{
if(b == 0)
return a;
return gcd(b, a%b);
}
/* least common multiple */
uint lcm(uint a, uint b)
{
if(a < 1 || b < 1)
return 0;
if(a < b) {
a = a + b;
b = a - b;
a = a - b;
}
return (a*b / gcd(a, b));
}
int main(void)
{
uint a=0, b=0;
scanf("%u %u", &a, &b);
printf("%u\n", lcm(a, b));
}
Python 代码实现
def gcd(a, b):
if(b == 0):
return a
return gcd(b, a%b)
def lcm(a, b):
if(a < 1 or b < 1):
return 0
if(a < b):
a = a + b
b = a - b
a = a - b
return (a*b / gcd(a, b))
a, b = input().split()
c = lcm(int(a), int(b))
print(int(c))