求最大公约数的几种常见的方法 【详解】

这篇具有很好参考价值的文章主要介绍了求最大公约数的几种常见的方法 【详解】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

目录

一、关于公约数

二、计算最大公约数的方法 

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

2. 更相减损法(辗转相减法)

3. 分解质因数法

4. 穷举法 

5. 递归法

6. 短除法

三、总结


一、关于公约数

首先 ,先介绍一下公约数:

公约数(公因数),一个能被若干个整数同时整除的的整数,公约数中最大的称为最大公约数。

公约数与公倍数相反,就是既是A的约数同时也是B的约数的数,12和15的公约数有1,3,最大公约数就是3。再举个例子,30和40,它们的公约数有1,2,5,10,最大公约数是10。

计算两个数组的最大公约数,例如计算 a,b两个数的最大公约数。

二、计算最大公约数的方法 

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

第一步,先是两个数进行 模运算,来求余数   即 a%b

①当a可以被b整除时 (a%b == 0),直接返回 b , b就是最大公约数。例a = 4;b = 2;a%b==0,所以b = 2,就是这两个数的最大公约数。

②当a%b != 0时,则进行辗转交换,这里用第三个变量来接收 c = a%b; 用 a 来接收 b的值,用b来接收c(余数的值)。

例 a = 6,b = 12; c = a%b = 6;    a = b = 12;  b = c = 6;  a%b = 12%6 = 0。 最大公因数为 6。

共有约数中最大的一个

③重复上述①和② 

算法流程图

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

代码展示 

//求最大公约数  辗转相除法
#include <stdio.h>
int fun(int a,int b)
{
	while (a % b != 0)
	{
		int c = a % b;
		a = b;
		b = c;
	}
	return b;
}
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = fun(a,b);
	printf("最大公约数为:%d",ret);
	return 0;
}

示例:

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

2. 更相减损法(辗转相减法)

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

思想

原文是

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

翻译:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;

若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。

其中所说的“等数”,就是公约数。求“等数”的办法是“更相减损”法。

提取上述的一些思想

例 a = 12, b = 18;  b = b - a = 18 - 12 = 6; a >b; a = a - b = 12 - 6 = 6; a = b = 6; 。

算法流程图
求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

代码展示 

//更相减损法(辗转相减法)
#include<stdio.h>
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	while (a != b) 
	{
		if (a > b)
			a = a - b;
		else
			b = b - a;
	}
	printf("最大公约数是:%d",a);
	return 0;
}

示例

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

3. 分解质因数法

 把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数

例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)= 12

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

代码展示

#include<stdio.h>
void fun(int * arr,int n)
{
	int i = 2, j = 0;
	while (n > 1)
	{
		if (n % i == 0)
		{
			arr[j++] = i;
			n /= i;
		}
		else 
		{
			i++;
		}
	}
}
int gcd(int a,int b) 
{
	//因为要进行找这个数的共有的因数,所以这里用数组来接收
	int arr_a[100] = {0};//放a的所有因数
	int arr_b[100] = {0};//放b的所有因数
	//进行放因数
	fun(arr_a,a);
	fun(arr_b,b);

	//找出公共的因数,然后相乘
	int i = 0, j = 0, ret = 1;
	while (arr_a[i] != 0 && arr_b[j] != 0) 
	{
		if (arr_a[i] == arr_b[j]) 
		{
			ret *= arr_a[i];
			i++;
			j++;
		}
		else if (arr_a[i] > arr_b[j])
		{
			j++;
		}
		else
		{
			i++;
		}
	}
	return ret;
}
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int ret = gcd(a,b);//最大公因数
	printf("%d和%d的最大公因数是:%d",a,b,ret);
	return 0;
}

 求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

4. 穷举法 

 穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法

这里的枚举法就是 先 用一个临时变量来接收(a或b) 其中的一个数,然后连个数进行模运算,两个数都模这个临时变量等于零就是最大公约数,否则临时变量每次减一,然后重复上述。

代码展示 

//穷举法
#include<stdio.h>
int main() 
{
	int a = 0;
	int b = 0;
	scanf("%d %d",&a,&b);
	int t = a;
	while (t--)
	{
		if (a % t == 0 && b % t == 0)
			break;
	}
	printf("%d",t);
	return 0;
}

5. 递归法

这里的递归法是基于辗转相除法的思想,然后通过递归来实现。

两个数的最大公约数 ,其中 较小的数  和 两个数相除的余数 的最大公约数

当 y / x%y == 0 时 , y就是最大公约数。

不为0, 就递归 gcd(y,x%y),  gcd 下方代码有描述

算法流程图

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

代码实现 

#include<stdio.h>
int gcd(int a, int b)
{
	if (b == 0)
		return a;
	else
		return gcd(b,a%b);
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = gcd(a,b);
	printf("%d",ret);
	return 0;
}

6. 短除法

例如:求12与18的最大公因数。以下如有约数出现则为因数

短除法例题:

12的因数有:1、2、3、4、6、12。

18的因数有:1、2、3、6、9、18。

12与18的公因数有:1、2、3、6。

12与18的最大公因数是6。

算法思想:

第一步:先是分别计算处两个数的所有因数,然后分别用数组来进行存放两个数组的所有因数(这里也可以只用一个数组)本例中为方便大家的理解采用两个数组进行存放。

注意:这里的存放也是有技巧的,这里采取的是从大到小进行排序的(当然也可以进行采取从小到大进行排序)

第二步:进行遍历找出相同的因数进行比较,使用一个临时变量用来存放最大公因数

 代码展示

#include<stdio.h>
void fac(int* arr, int n)
{
	int i = 0;
	int j = 0;
	int k = 0;
	for (i = 1; i <= n; i++)
	{
		if (n % i == 0)
		{
			arr[k++] = i;
		}
	}
}
int gcd(int a, int b)
{
	int arr1[100] = { 0 };
	int arr2[100] = { 0 };
	fac(arr1, a);
	fac(arr2, b);

	//求同找最大
	int i = 0, j = 0, max = 1;
	while (arr1[i] != 0 && arr2[j] != 0)
	{
		if (arr1[i] == arr2[j])
		{
			if (max < arr1[i])
			{
				max = arr1[i];
			}
			i++;
			j++;
		}
		else if (arr1[i] < arr2[j])
		{
			i++;
		}
		else
		{
			j++;
		}
	}
	return max;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = gcd(a, b);
	printf("%d 和 %d 的最大公因数为 %d",a,b ,ret);
	return 0;
}

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

三、总结

这里比较推荐是用 辗转相除法(欧几里得算法)和 《九章算术》中的 更相减损法

多说一下,因为当时阿明浅浅学过遍辗转相除法,然后不久后就忘干净了,用的时候还要再去反复找,为了方便使用,干脆把 求解最大公约数 的几种常见的方法详细介绍一下,虽然不是最好,但是多少希望对大家有些帮助!

希望大家对这些方法,有更加深刻的印象。

求最大公约数的几种常见的方法 【详解】,【C语言】,C语言,算法,最大公约数

加油!!! 文章来源地址https://www.toymoban.com/news/detail-720321.html

到了这里,关于求最大公约数的几种常见的方法 【详解】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++求最大公约数和最小公倍数的方法

    每次遇到最大公约数和最小公倍数时总是忘记,这里总结了两种求最大公约数和最小公倍数的方法。 欧几里得算法是求解两个数的最大公约数的一种常用方法。该算法基于以下原理:两个整数的最大公约数等于其中较小数和两数的余数之间的最大公约数。可以通过递归调用该

    2024年02月15日
    浏览(46)
  • 【c语言】—求最大公约数和最小公倍数多种方法

    目录 一.求最大公约数 1.枚举法求最大公约数 2.辗转相除法 二.求最小公倍数 1.枚举法求最小公倍数 2.简易法 3.公式法 思路:先求两个数中的最小值,最大公约数不可能大于两个数的最小数 比如6和18,最大公约数就是6 再如3和9,最大公约数就是3 然后再从1开始循环遍历到最小

    2024年02月08日
    浏览(60)
  • C语言入门——求最大公约数(2种方法超详细)

    基本介绍: 最大公约数(greatest common divisor,简写为 gcd ;或highest common factor,简写为hcf),指某几个整数共有因子中最大的一个。 最大公约数 能够整除一个整数的整数称为其的约数(如5是10约数); 能够被一个整数整除的整数称为其的倍数(如10是5的倍数); 如果一个数既

    2024年02月08日
    浏览(102)
  • 你会求两个数的最大公约数吗(三种方法)?

    目录 前言 一、枚举法 二、辗转相除法 三、更相减损法 如何求两个数的最大公约数是非常经典的问题,求解的方法也有很多,本文主要介绍其中的三种方法,分别是: 枚举法、辗转相除法和更相减损法 。   两个数的最大公约数一定小于或等于两数中较小的数,并且这两个

    2023年04月08日
    浏览(49)
  • 【约数】求最大公约数——递归

    请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。 G C D ( n , m ) = { = m , 当 m = n 且 n m o d m = 0 = G C D ( m , n ) , 当 n m 时 = G C D ( m , n m o d    m ) , 其他 GCD(n,m)=left{begin{matrix} =m,当 m=n 且 n mod m =0\\\\ =GCD(m,n),当nm时\\\\ =GCD(m,n mod m),其他 end{matrix}right. GC D ( n , m ) = ⎩ ⎨ ⎧ ​ = m

    2024年02月03日
    浏览(42)
  • 辗转相除法求最大公约数

    辗转相除法也被称为欧几里得算法,是求两个整数的最大公约数(GCD)的一种常用方法。 辗转相除法的原理是基于两个整数的最大公约数与它们的余数的最大公约数相等的性质。具体步骤如下: 用较大的数除以较小的数,得到一个商和余数。 如果余数为0,则较小的数即为最

    2024年02月05日
    浏览(66)
  • 最大公约数和最小公倍数问题

    等差数列 蓝桥杯192 gcd问题 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。 现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项? 思路:求出每一项之差的最大公约数,以这个

    2023年04月09日
    浏览(41)
  • C++ 最大公约数与最小公倍数

    (一)简单的两个正整数  求 最大公约数 (引入专题) 思路: 根据 “欧几里得算法”  ,即 “辗转相除法” 原理如下: 题意: 求出   a  , b  两个正整数的最大公约数 设  k = a / b,   r = a % b 即    a = k * b + r 又设  d  为 a 和 b 的一个公约数 那么由  r = a - k * b,  可

    2024年02月06日
    浏览(48)
  • 【算法】辗转相除法求最大公约数

    辗转相除法 ,又称 欧几里德算法(Euclidean Algorithm) ,是求两个数的 最大公约数(greatest common divisor) 的一种方法。用较大的数除以较小的数,再以除数和余数反复做除法运算,当余数为0时,取当前算式除数为最大公约数。 求30和18的最大公约数: 30 /  18  = 1 余  12 18 

    2024年02月14日
    浏览(56)
  • 【ARM汇编】如何用汇编求最大公约数?

    CSDN话题挑战赛第1期 活动详情地址 :话题PK赛 参赛话题 :汇编知识分享 话题描述 :我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是

    2024年01月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包