最小公倍数(LCM)与最大公约数(GCD)算法

最大公约数

       关于求最大公约数和最小公倍数,最简单的也就是穷举法了。不过穷举法效率低下,大家基本也都会,就不做介绍了。这里介绍另外两种比较经典的算法:辗转相除法和更相减损法。

1.辗转相除法

       ①有两整数a和b(假设a > b),且a % b = k ...r

       ②如果r == 0,则b即为最大公约数

       ③如果r != 0,令a = b,b = r,重复①

       相关证明可参考百度百科,上面写的很详细。

       代码如下:

#include<stdio.h>

int main(){
	int a, b, r;
	scanf("%d%d", &a, &b);
	//辗转相除法
	while(b != 0){
		r = a % b;
		a = b;
		b = r;
	}	
	printf("%d", a);
	return 0;
}

另外这里提供一种递归的算法,很简洁:

//辗转相除法(递归)
int Gcd(int a, int b){
	return b == 0 ? a : Gcd(b, a % b);
} 

2.更相减损法

       更相减损术出自《九章算术》,是老祖宗的智慧。原文为:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。(白话文翻译可搜索百度百科)

       这里为简洁起见,就不再“半之”了。算法如下:

       ①有两整数a和b,如果a > b,a = a - b

       ②如果b > a,b = b - a

       ③如果a == b, 则a(或b)即为最大公约数

       ④如果a != b, 则回到第一步

       代码如下:

#include<stdio.h>

int main(){
	int a, b;
	scanf("%d%d", &a, &b);
	//更相减损法
	while(a != b){
		if(a > b) a = a - b;
		else b = b - a;
	}
	printf("%d", a);
	return 0;
}

最小公倍数

       这里提出一个简单的公式法:LCM = a * b / GCD。即最小公倍数等于两数乘积除以最大公约数。

猜你喜欢

转载自blog.csdn.net/LightInDarkness/article/details/81436649
今日推荐