求最大公约数-欧几里得算法(辗转相除法)

首先,我们得明确最大公约数是什么。

假设有两个整数 aa 和 bb,它们的公约数 就是能够同时整除 aa 和 bb 的整数。换句话说,就是那些既能整除 aa,又能整除 bb 的数。我们找到所有这样的数,然后从中选出最大的那个,就是它们的最大公约数。

举个例子

比如,我们有两个数:1824

  • 18 的约数有:1, 2, 3, 6, 9, 18

  • 24 的约数有:1, 2, 3, 4, 6, 8, 12, 24

它们的公约数就是:1, 2, 3, 6,最大公约数就是 6。

要找最大公约数,有一种非常高效的方法叫做辗转相除法 ,它也叫做欧几里得算法。它的核心思想是:通过一系列的除法操作,不断缩小问题的规模,最终能够求出最大公约数。

辗转相除法的基本思想:

  1. 假设我们有两个数 aa 和 bb,我们希望找它们的最大公约数(GCD)。

  2. 计算 a÷ba÷b 的余数 rr,即: r=a%br=a%b

  3. 然后把 bb 和余数 rr 作为新的两个数,再重复上面的步骤:求新的余数,直到余数为零。

  4. 当余数为零时,最后一个非零的余数就是 aa 和 bb 的最大公约数。

证明辗转相除法的正确性

辗转相除法为什么能有效求出最大公约数呢?这其实跟数学中的贝祖定理(Bézout's identity)有关系。

贝祖定理说的是:对于任意的两个整数 aa 和 bb,它们的最大公约数 gcd(a,b)gcd(a,b) 可以表示成:gcd(a,b)=a×x+b×ygcd(a,b)=a×x+b×y其中 xx 和 yy 是整数。

通过辗转相除法,不断地把 aa 和 bb 进行除法操作,实际上是在逐步逼近这个最大公约数,最终通过一系列的余数关系得出最大公约数。

在每一步的除法过程中,剩下的余数总是保持与原来两个数的公约数相同,只不过逐渐缩小了范围,所以我们可以通过这种方法最终求出最大公约数。

复制代码
int gcd(int a, int b) {
  if (b == 0) return a;
  else return gcd(b, a % b);
}
相关推荐
一次旅行4 分钟前
ViT/CLIP/LLaVA/GPT-4V/VideoLLM多模态架构全解:原理仿真+工业落地选型+完整推理代码
人工智能·算法·架构
神明不懂浪漫39 分钟前
【第五章】队列
开发语言·数据结构·经验分享·笔记·算法
happy_baymax40 分钟前
MATLAB MCP Server+ MATLAB Agentic Toolkit+Simulink Agentic Toolkit自动更新批处理文件.ps1
人工智能·算法
橘和柠1 小时前
知识图谱实战(一):数据采集与实体关系抽取(完整代码)
算法
Mem0rin2 小时前
前缀和:中心下标与数组乘积
数据结构·算法
windliang2 小时前
Claude Code 源码分析(八):Memory 如何被写入、整理与按需召回
前端·算法·面试
漂流瓶jz2 小时前
UVA-12174 Shuffle的播放记录 题解答案代码 算法竞赛入门经典第二版
数据结构·c++·算法·图论·滑动窗口·算法竞赛入门经典·uva
Forever Nore2 小时前
LeetCode 6 Z 字形变换 - 按行模拟
算法·leetcode
fkyyly3 小时前
hermes解读
算法·code_agent
过期的秋刀鱼!3 小时前
使用都热编码的分类特征
人工智能·算法·决策树·机器学习·分类·数据挖掘