最大公约数定义如下:

公约数,也被称为“公因数”。它是一个能被若干个整数同时均整除的整数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”,公约数中最大的整数即为“最大公约数”。

以下我将介绍8种求最大公约数的方法,这些方法中,最常用到的公约数求法的思想我已用代码实现了,并附有运行结果的分析,小伙伴看完就再也不用怕最大公约数和最小公倍数的题了!!

主要算法及示例

题目:输入任意两个数n,m,求它们的最大公约数。

1. 查找公约数法

根据已有的数学知识我们知道,m>n的话,m,n的最大公约数永远不可能是m(因为n/m不能整除),只可能是n。所以我们只需要从n开始依次向较小数找到“能同时被n,m整除的第一个整数”即为两数的最大公约数。代码实现如下:

#include<iostream>
using namespace std;
int main()
{
	int n,m;
	int times = 0;
	cin>>n>>m;  //输入两个数
	int x = n<m?n:m;  //m,n的最大的公约数永远不可能是较大的那个数,只可能是较小的数
	for(x;x>=1;x--)
	{
		times ++;
		if(n%x==0&&m%x==0)   //x正好被n,m整除,则找到了x
			break;  
	}
	cout<<"循环次数为:"<<times<<endl;
	cout<<"最大公约数为:"<<x<<endl;
	return 0;
}

运行结果分析:
在这里插入图片描述

2. 更相减损法

1)判断两个数是否是偶数,如果是就用2约简至两个数都不是偶数;如果不是则执行第二步
2)假设a>b,则c = a-b,接着c与b比较,再次较大的数减去较小的数,直到较小的数与当前的差c相等。
则最大公约数等于第一步中约掉的若干个2与第二步中得出的c的乘积。

#include<iostream>
#include <math.h>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int times = 0; //循环次数
	int count = 0; //2被除的次数
	int result = 0;  //结果
	while(m%2 == 0 & n%2 == 0){
		times ++;
		count++;    //约掉2的次数
		m /= 2;
		n /= 2;
	}
	while(n!=m){   //更相减损
		times ++;
		if(n>m)n=n-m;
		else m=m-n;
	}
	result = m * pow(2,count); //pow为math中方法
	cout<<"循环次数为:"<<times<<endl;
	cout<<"最大公约数为:"<<result<<endl;
	return 0;
}

运行结果分析:
在这里插入图片描述

3. 求差判定法

如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数。
例如:求78和60的最大公约数用 78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6。

如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和小数的最大公约数就是原来两数的最大公约数。
例如:求92和16的最大公约数用 92-16=76,76- 16=60, 60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,所以92和16的最大公约数就是4。

4. 分解因式法

先分别把两个数分解质因数,再找出它们全部公有的质因数,然后把这些公有质因数相乘,得到的积就是这两个数的最大公约数。
例如:求125和300的最大公约数,因为125= 5x5x5, 300=2x2x3x5x5,所以125和300的最大公约数是5x5=25。

5. 短除法

为了简便,将两个数的分解过程用同一个短除法来表示,那么最大公约数就是所有除数的乘积。
例如:求180和324的最大公约数,如下计算,因为9和5互质,所以180和324的最大公约数是2x2x9=36。
在这里插入图片描述

6. 除法

当两个数中较小的数是质数时,可采用除法求解,即用较大的数除以较小的数,如果能够整除,则较小的数是这两个数的最大公约数。
例如:求19和152的最大公约数。因为152/19=8(19是质数),所以19和152的最大公约数是19。

7. 缩倍法

如果两个数没有之间没有倍数关系,可以把较小的数依次除以2、3、…直到求得的商是较大数的约数为止,这时的商就是两个数的最大公约数。
例如:求30和24的最大公约数,24/2=12,12不是30约数;24/3=8,8不是30约数;24/4=6, 6是30的约数,所以30和24的最大公约数是6。

8. 辗转相除法

在这里插入图片描述

代码实现:

#include<iostream>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	int a=1;  //默认在最大公约数为1
	int times =0;

	if(n%m==0||m%n==0)  //若nm直接能整除,则最大公约数即是较小那个的数
	{
		times++;
		m=m<n?m:n;
	}
	
	while((a=n%m)!=0)
	{
		times++;
		n=m;
		m=a;
	}
	cout<<"循环次数为:"<<times<<endl;
	cout<<"最大公约数为:"<<m<<endl;
	return 0;
}

运行结果分析:
在这里插入图片描述
以上就是我了解到的所有方法,之前作者用C语言也实现过 求最大公约数,有问题欢迎留言讨论~

看完记得关注博主哟~ 下篇博客是牛客网的题目:求最小公倍数!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐