求最小公倍數
- 時間限制: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))