求最大公约数的三种常用方法:辗转相除法、更相减损法、枚举法

今天不学习,明天变垃圾


一、什么是最大公约数?

公约数,亦称公因数,与公倍数相反,它是一个能同时整除若干整数的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”。公因数中最大的那个称为最大公约数。
例如,12和18的公约数有1、2、3、6,最大公约数就是6;30和40的公约数有1、2、5、10,最大公约数是10。

二、求最大公约数的三种常用方法

2.1. 辗转相除法(欧几里得算法)

首先将两个数进行模运算,即a%b
① 当a能被b整除时即 a%b == 0,直接返回 b ,b就是最大公约数。
例如,a=12,b=6,a%b=0,b=6就是这两个数的最大公约数。
② 当a不能被b整除时 a%b != 0,则进行辗转相除。
用第三个变量来接收 a%b,即c = a%b,用 a 来接收 b的值,用 b 来接收 c 的值。
③ 重复上述①和②

例如:

a = 6,b = 12;
a%b != 0;
c = a%b = 6;
a = b = 12;
b = c = 6;
a%b = 12%6 = 0;
所以6和12最大公因数为 6

通俗一点,辗转相除:不能整除时,把a赋值为b,b赋值为a%b,直到可以整除为止。 c只是一个临时中间变量。

  • 算法流程图
    辗转相除法
    非递归代码实现
//求最大公约数 辗转相除法
int fun(int a, int b)
{
    
    
	while (a % b != 0)
	{
    
    
		int c = a % b;
		a = b;
		b = c;
	}
	return b;
}

递归代码实现

int gcd(int a, int b)
{
    
    
	if(a%b == 0)
		return b;
	else 
		return gcd(b,a%b);
}

2.2. 辗转相减法(更相减损术)

更相减损术是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。

原文:

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

翻译:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;
若不是则执行第二步。
第二步:把较大的数减较小的数,将所得的差与较小的数比较,并以大数减小数。重复这个操作,直到所得的减数和差相等为止。
第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。

编写代码时运用提取上述第二步的思想最为简便,例如:

a = 12,b = 18;
b > a;
b = b - a = 6;
a > b;
a = a - b = 6;
a = b = 6;
所以6和12最大公因数为 6

通俗一点,辗转相减:不相等时,大的那个赋值为大 - 小,直到相等为止。

代码实现

//求最大公约数 辗转相减法
int fun(int a, int b)
{
    
    
	while(a != b)
	{
    
    
		if(a > b)
			a = a-b;
		if(b > a)
			b = b-a;
	}
	return a;
}

2.3. 枚举法

最暴力无脑的方法,直接从a、b中小的那个开始一个一个往下找。

代码展示

//枚举法
int fun(int a, int b)
{
    
    
	int tmp;
	if(a <= b) tmp = a;
	else tmp = b;	
	while(tmp)
	{
    
    	
		if(a%tmp == 0 && b%tmp == 0)
			break;
		tmp --;
	}
	return tmp;
}

总结

这篇文章学习了求最大公约数的三种常用方法:辗转相除法、辗转相减法、枚举法。
我可以一直学