你会求两个数的最大公约数吗(三种方法)?

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

目录

前言

一、枚举法

二、辗转相除法

三、更相减损法



前言

如何求两个数的最大公约数是非常经典的问题,求解的方法也有很多,本文主要介绍其中的三种方法,分别是:枚举法、辗转相除法和更相减损法

 

一、枚举法

两个数的最大公约数一定小于或等于两数中较小的数,并且这两个数必定至少存在一个公因数 1,利用这两个条件,可以将两个数的最大公约数的所有可能都列举出来。

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int min = 0;
	scanf("%d%d", &a, &b);
	if (a > b)
		min = b;
	else
		min = a;
	for (int i = min; i > 0; i--)  // i:min -> 1
	{
		if (a % i == 0 && b % i == 0)
		{
			printf("的最大公约数为 %d", i);
			break;
		}
	}
	return 0;
}

二、辗转相除法

辗转相除法,又名欧几里得算法,是求最大公约数的一种算法。辗转相除法首次出现于欧几里得的《几何原本》中的第 Ⅶ 卷,书中的命题 i 和命题 ii 所描述的就是辗转相除法

辗转相除法的本质就是:用一个数除以另一个数,如果余数不为 0,则用除数除以余数,一直反复,直到余数为 0 为止,即 a % b = r1,若 r1 ≠ 0,则用 b % r1 = r2,若 r2 ≠ 0,那么一直反复,直到某个余数 rn 为0 为止,最后一条式子的除数就是两个数的最大公约数

把两个数看作被除数与除数的关系,则两个数的最大公约数就等于除数与余数的最大公约数,即 gcd(a, b) = gcd(b, r)。

辗转相除法源于希腊,希腊人非常喜欢从图形或者是用几何的角度去看待问题,很多希腊数学家都习惯先去思考能否将其转换为直观的几何图形再进行求解。所以很自然地,希腊数学家在面对求两个数的最大公约数这个问题时,也首先去思考这个问题是否能通过将其转换成一个几何问题来处理。在经过一些尝试之后,这一设想最终实现了,希腊数学家将所要求最大公约数的两个数字 a 和 b 分别作为矩形的两条边,那么这个问题就被转换成在这个矩形中找到这样一个正方形,这个正方形能够没有缝隙地铺满上述矩形,显然这类正方形可能有多个(当然,也只考虑正整数边长的正方形),而我们的目标就是找出这类正方形中最大的那一个

那么我们如何找到这样一个正方形呢?具体操作如下

你会求两个数的最大公约数吗(三种方法)?

证明:我们假设 a = 16,b = 6,两个数的最大公约数为 c。

显然 c <= b,因此我们先用矩形的短边 b 构造正方形,然后判断这样的正方形能否铺满整个矩形,判断方式可以是计算两个数的余数。因为 a ÷ b = n ... r,余数 r 不为零,所以 c ≠ b。又因为 a = k1c,b = k2c,r = a - n·b = k1c - nk2c = (k1 - nk2)c,所以 c 也是余数 r 的约数,那么 c <= r,因此再用余数 r 构造正方形,判断这样的正方形能否铺满以 b 和 r 为边的小矩形,即计算 b % r 的结果。

用余数 r 构造的正方形如果能铺满以 b 和 r 边的小矩形,则一定能铺满整个大矩形。

一直反复,直到余数为 0 为止,最后能铺满矩形的正方形的边长就是 a 和 b 的最大公约数。

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int r = 0;
	scanf("%d%d", &a, &b);
	while ((r = a % b) != 0)  
	{
		// 若余数不为 0
		a = b;
		b = r;
	}
	// 当余数为 0 时,除数就是两数的最大公约数
	printf("最大公约数是 %d\n", b);
	return 0;
}

三、更相减损法

更相减损术是出自《九章算术》的一种求最大公约数的算法,其本质是:以较大的数减去较小的数,接着把所得的差与较小数相比较,并以较大数减较小数,继续这样的操作,直到所得的减数和差相等为止,即若 a > b,a - b = s1(s1 ≠ 0),若 b > s1,b - s1 = s2(s2 ≠ 0),若 s1 = s2,s1 - s2 = 0,那么 s1、s2 就是 a 、b 的最大公约数文章来源地址https://www.toymoban.com/news/detail-404441.html

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d%d", &a, &b);
	while (a != b)
	{
		if (a > b)
			a -= b;  // 当 a > b 时,a 来保存两数的差
		else
			b -= a;  // 当 a < b 时,b 来保存两数的差
	}
	printf("最大公约数是 %d", a);
	return 0;
}

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

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

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

相关文章

  • C语言——输入两个正整数m和n,求其最大公约数和最小公倍数

    目录 1.最大公约数求法 1.1辗转相除法 1.2相减法 2.最小公倍数求法 3.代码实现 4.结果展示 1.1辗转相除法 设有两整数a和b: a%b得余数c 若c==0,则b即为两数的最大公约数 若c!=0,则a=b,b=c,再回去执行第一步。 例如:求27和15的最大公约数过程为: 27÷15 余12 15÷12 余3 12÷3 余0 因

    2024年02月01日
    浏览(31)
  • C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

    1、首先,程序通过printf函数提示用户输入两个正整数m和n,然后使用scanf函数接收用户的输入并将值分别存储到变量m和n中。 2、接下来,程序进入一个for循环,从1开始遍历直至i等于较小的数(m或n),检查当前数值i是否能同时整除m和n。如果i既能被m整除又能被n整除(即满足

    2024年02月03日
    浏览(36)
  • 【Python 基础】输入两个数,求它们的求最大公约数(伪码描述 + Python实现)| 区块链 面试题:区块链技术中的“闪电网络”是什么?有什么作用?

      “这样的年代没有谁是值得信任的,你只能靠自己。”     🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿   🌟[3] 2022年度博客之星人工智能领域TOP4🌟   🏅[4] 阿里云社区特邀专家博

    2024年02月01日
    浏览(54)
  • 【约数】求最大公约数——递归

    请使用递归算法计算正整数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日
    浏览(32)
  • 最大公约数的四种方法

    求两数的最大公约数,一共有四种方法:暴力穷举法、更相减损法、辗转相除法、stein 算法,小女不才,花了几天的时间终于把这几种方法全部弄明白,现在就把它们全部分享出来。 首先,假设被求的两个数为 x、y,且 x y。最大公约数 d = gcd (x , y) 正如名字所说,暴击穷举法

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

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

    2023年04月09日
    浏览(32)
  • 辗转相除法求最大公约数

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

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

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

    2024年02月14日
    浏览(46)
  • C++ 最大公约数与最小公倍数

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

    2024年02月06日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包