编程练习——求最小公倍数

求最小公倍数

  • 时间限制: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))
发布了299 篇原创文章 · 获赞 1219 · 访问量 159万+

猜你喜欢

转载自blog.csdn.net/luckydarcy/article/details/102784607