【算法】最大公约数和最小公倍数求解

1.概念:

  • 最大公约数(Greatest Common Divisor,gcd)是数学词汇,指能够整除多个整数的最大正整数。而多个整数不能都为零。例如8和12的最大公因数为4。[维基百科]

  • 最小公倍数(Least Common Multiple,lcm)是数论中的一个概念。若有一个数X,可以被另外两个数A、B整除,且X大于(或等于)A和B,则X为A和B的公倍数。所有正的公倍数中,最小的公倍数叫做最小公倍数。[维基百科]

2.求解最大公约数效率最高的当属辗转相除法(也叫欧几里得法)

而求最小公倍数可以利用公式lcm = m*n/gcd,这样最便捷。

  • 代码示例如下
// 最大公约数:辗转相除法
int gcd(int m, int n)
{
	if (n==0) return m;
	if (m<n)
		return gcd(n, m);
	int reminder = 0;
	while (n!=0)
	{
		reminder = m%n;
		m = n;
		n = reminder;
	}

	return m;
}

// gcd recursively
int gcd_iterative(int m, int n)
{
	return (n==0)?m:gcd_iterative(n, m%n);
}

// 最小公倍数:lcm=m*n/gcd;
int lcm(int m, int n)
{
	if (m*n==0) return 0;
	int gcd_num = gcd(m, n);
	if (gcd_num>=1)
		return (m*n/gcd_num);
}

相关复杂度讨论可以参考ACM数论专题1——gcd与lcm https://codeantenna.com/a/raQ447c1CC

posted @ 2022-03-04 14:12  coffee_tea_or_me  阅读(108)  评论(0编辑  收藏  举报