什么是公约数?/最大公约数求法(欧几里得算法/辗转相除法)

发布时间:2024年01月15日

目录

什么是公约数?

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

代码实现


什么是公约数?

????????想要求得最大公约数首先要知道什么是公约数(又称公因数)是指能同时整除几个整数的数?。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”;公约数中最大的称为最大公约数。

比如:

????????20的约数有1,2,4,5,10,20;

? ? ? ? 15的约束有1,3,5,15;

20和15的公约数有1和5;

则20和15的最大公约数为5;

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

在学习辗转相除法之前需要先理解最大公因数的求法:

? ? ? ? 如果c能够整除a,b那么c同样可以整除(ax+by)比如:5能够整除15和20,所以可以整除85(15*3+20*2),同样的5可以整除5(20-15);

? ? ? ? 这个例子可能不够直观432和243的最大公约数是27,243 和 189(432 - 243)的最大公约数也是27,189 和 54(243 - 189)的最大公约数也是27,135(189 - 54)和 54的最大公约数也是27,81(135 - 54) 和 54的最大公约数也是27,最后会剩下54和27(81 - 54),54 - 27最后会的到27。

运算步骤有:

? ? ? ? 432 - 243 = 189

? ? ? ? 243 - 189 = 54

? ? ? ? 189 - 54 = 135

? ? ? ? 135 - 54 = 81

? ? ? ? 81 - 54 = 27

? ? ? ? 54 - 27 = 27

? ? ? ? 中间有重复减去54的步骤,可以简化为189%54 = 27。普通的减法也可以改为%;

? ? ? ? 因为都是重复的运算可以用while循环或者递归完成这系列操作

? ? ? ? 如果把递归(循环)的跳出条件是两个数字中其中一个数字为0的话最后的全部运算步骤就为:

? ? ? ? 432%243 = 189? ? ? ? a = 432 b = 243

? ? ? ? 243%189 = 54? ? ? ? ? a = 243 b = 189

? ? ? ? 189%54 = 27? ? ? ? ? ? a = 189 b = 54

? ? ? ? 54%27 = 0? ? ? ? ? ? ? ? a = 54? ?b = 27

? ? ? ? 27%0 =? ? ? ? ? ? ? ? ? ? ?a = 27? ? b = 0? ? ? ? 此步骤b = 0所以跳出递归(循环),剩下的数字a即为432和243的最大公约数27;

代码实现

核心代码:

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

简化代码:

int gcd(int a, int b) {
    return (b==0) ? a : gcd(b, a % b);
}

完整代码:

#include<iostream>
using namespace std;

int gcd(int a,int b)
{
	return (b == 0)?a:gcd(b,a%b);
}

int main()
{
	int a,b;
	cin >> a >> b;
	cout << gcd(a,b);
	return 0;
}

文章来源:https://blog.csdn.net/YUSHI_wind/article/details/135573820
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。