編程練習——求最小公倍數

求最小公倍數

  • 時間限制:1秒
  • 空間限制:32768K

描述

正整數A和正整數B 的最小公倍數是指 能被A和B整除的最小的正整數值,設計一個算法,求輸入A和B的最小公倍數。

  • 輸入:兩個正整數 A 和 B。
  • 輸出:A 和 B 的最小公倍數。

例如,輸入 5 7,輸出 35

分析

我們知道,兩個數的乘積等於這兩個數的最大公約數與最小公倍數的乘積。如果 [a, b] 表示 a 和 b 的最小公倍數,(a, b) 表示 a 和 b 的最大公約數,那麼:
[a,b]=a×b(a,b) [a, b] = \frac{a \times 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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章