计算机考研之数据结构:深入解析最大公约数与欧几里得算法

news2025/2/21 5:11:30

一、生活中的公约数应用

在日常生活中,经常需要处理"均分分配"问题。例如:要将24块巧克力和18块饼干平均分给小朋友,最多能分给几个小朋友?这就是典型的求最大公约数问题。

二、基本概念详解

  1. 约数与公约数
    • 约数:如果一个整数能整除另一个整数(如3是6的约数),则称为约数
    • 公约数:两个数的公共约数(如12和18的公约数是1, 2, 3, 6)
  2. 最大公约数(GCD) 公约数集合中的最大数,记为 gcd(a,b)。例如:
gcd(12,18) = 6 
gcd(9,14) = 1(互质)

三、欧几里得算法原理解析

古希腊数学家欧几里得在《几何原本》中提出的算法,基于以下核心发现:

关键定理: gcd(a,b) = gcd(b, a mod b)
(a > b,当 a < b 时交换即可)

直观理解: 假设 d 是 a 和 b 的公约数,则:

  • d能整除a → a = kd
  • d能整除b → b = md 此时余数r = a - qb = kd - q(md) = (k - qm)d → d也是r的约数

过程演示: 求 gcd(46,24)

步骤1:46 ÷ 24 = 1 余22 → gcd(24,22)
步骤2:24 ÷ 22 = 1 余2 → gcd(22,2)
步骤3:22 ÷ 2 = 11 余0 → gcd(2,0)
终止条件:当余数为0时,当前除数是2 → 最大公约数 

四、算法实现详解

递归版

int gcd(int a, int b) {
    if (b == 0)   // 基线条件:当余数为0时返回当前除数 
        return a;
    return gcd(b, a % b); // 递归调用缩小问题规模 
}

执行流程示例:gcd(46,24)

调用栈展开:
gcd(46,24) → gcd(24,22) → gcd(22,2) → gcd(2,0)
返回值回溯:2 ← 2 ← 2 ← 2 

迭代版本

int gcd(int a, int b) {
    while(b != 0) {
        int temp = a;  // 临时保存被除数 
        a = b;         // 除数变为新的被除数 
        b = temp % b;  // 计算新余数 
    }
    return a;         // 当余数为0时返回 
}

执行过程追踪表(以gcd(46,24)为例):

循环次数abtemp新a新b
初始值4624---
第1次循环2422462446%24=22
第2次循环222242224%22=2
第3次循环2022222%2=0

五、数学原理证明

a = q b + r a = qb + r a=qb+r(q为商,r为余数)

  1. 公约数传递性
    若 d 是 a 和 b 的公约数,则:
    d | a → a = kd
    d | b → b = md
    余数r = a - qb = kd - q(md) = d(k - qm) → d | r
  2. 公约数等价性
    gcd(a,b) 与 gcd(b,r) 的公约数集合完全相同,因此最大公约数必然相等
  3. 有限性保证
    余数序列严格递减:r₁ > r₂ > … > 0,必然在有限步后得到0

六、边界条件处理

  1. 0的特殊处理
    当b=0时,gcd(a,0)=a(任何数与0的最大公约数是其自身)
  2. 负数处理
    算法默认处理正整数,若输入负数可取其绝对值:
int gcd(int a, int b) {
    a = abs(a);
    b = abs(b);
    // 原有算法逻辑 
}

七、复杂度分析

时间复杂度: O ( log ⁡ min ⁡ ( a , b ) ) O(\log \min(a,b)) O(logmin(a,b))

每次迭代余数至少减半,例如求 gcd ( F n , F n − 1 ) \text{gcd}(F_n, F_{n-1}) gcd(Fn,Fn1) 需要 n − 2 n-2 n2 次迭代(斐波那契数最坏情况)

空间复杂度:

递归版本: O ( log ⁡ n ) O(\log n) O(logn)(调用栈深度)
迭代版本: O ( 1 ) O(1) O(1)

八、实际应用场景

  1. 分数化简:如将 18/24 化简为 3/4,需用 gcd(18,24)=6 约分
  2. 密码学基础:RSA加密算法中需计算模反元素,依赖于互质条件
  3. 图形学计算:屏幕分辨率比例简化(如16:9→gcd(16,9)=1)

九、算法优化扩展

1. 二进制GCD算法

通过位移操作加速:

int binary_gcd(int a, int b) {
    if (b == 0) return a;
    if ((a & 1) == 0) {
        if ((b & 1) == 0) 
            return binary_gcd(a >> 1, b >> 1) << 1;
        else 
            return binary_gcd(a >> 1, b);
    } else {
        if ((b & 1) == 0)
            return binary_gcd(a, b >> 1);
        else 
            return binary_gcd(b, a > b ? a - b : b - a);
    }
}

2. 扩展欧几里得算法

在求gcd的同时求解贝祖等式:ax + by = gcd(a,b)

十、常见疑问解答

Q1:为什么算法不需要比较a和b的大小?

当a < b时,第一次计算a%b = a,交换顺序后自动转为处理gcd(b,a)

Q2:如何处理非常大的数值?

对于超过整型范围的数,可以使用高精度计算库或特殊数据结构

Q3:递归深度过大会导致栈溢出吗?

确实存在风险,建议对极大数使用迭代版本

Q4:这个算法能处理三个数的最大公约数吗?

可以递推计算:gcd(a,b,c) = gcd(gcd(a,b),c)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度搜索融合 DeepSeek 满血版,开启智能搜索新篇

百度搜索融合 DeepSeek 满血版&#xff0c;开启智能搜索新篇 &#x1f680; &#x1f539; 一、百度搜索全量接入 DeepSeek &#x1f539; 百度搜索迎来重要升级&#xff0c;DeepSeek 满血版全面上线&#xff01;&#x1f389; 用户在百度 APP 搜索后&#xff0c;点击「AI」即…

游戏引擎学习第103天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾bug 接下来回顾一下这个bug的具体情况。当前是一个调试视图&#xff0c;我们并不是直接在调试视图下工作&#xff0c;而是在进行相关的调试。展示了地图&#xff0c;这里是环境贴图&#xff0c;上面是正在使用的环境贴图&am…

WPF快速创建DeepSeek本地自己的客户端-基础思路版本

开发工具&#xff1a;VS 2015 开发环境&#xff1a;.Net 4.0 使用技术&#xff1a;WPF 本篇文章内容&#xff1a; 本地部署DeepSeek以后一般使用网页工具&#xff08;如Chatbox&#xff09;或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…

spring cloud gateway限流常见算法

目录 一、网关限流 1、限流的作用 1. 保护后端服务 2. 保证服务质量 (QoS) 3. 避免滥用和恶意攻击 4. 减少资源浪费 5. 提高系统可扩展性和稳定性 6. 控制不同用户的访问频率 7. 提升用户体验 8. 避免API滥用和负载过高 9. 监控与分析 10. 避免系统崩溃 2、网关限…

网络安全的态势如何以及如何解决?

大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…

2026考研趋势深度解析:政策变化+高效工具指南

2026考研深度解析&#xff1a;趋势洞察高效工具指南&#xff0c;助你科学备战上岸 从政策变化到工具实战&#xff0c;这份千字攻略解决99%考生的核心焦虑 【热点引入&#xff1a;考研赛道进入“高难度模式”】 2025年全国硕士研究生报名人数突破520万&#xff0c;报录比预计扩…

AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT

随着科研和学术报告需求的增加&#xff0c;如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐&#xff0c;需要大量文献收集、数据分析和设计工作&#xff0c;而AI工具能够帮助提升效率&#xff0c;减少重复劳动。 本文将介绍如何使用…

【Linux系统】—— 调试器 gdb/cgdb的使用

【Linux系统】—— 调试器 gdb/cgdb的使用 1 前置准备2 快速认识 gdb3 cgdb/gdb 的使用3.1 简单认识 cgdb3.2 打断点 / 删断点3.3 逐过程 / 逐语句3.4 查看变量3.5 快速跳转 4 cgdb/gdb 调试技巧4.1 watch4.2 「set var」确定问题原因4.3 条件断点 5 概念理解6 gdb/cgdb 指令一…

Wireshark 输出 数据包列表本身的值

在 Wireshark 中&#xff0c;如果你想输出数据包列表本身的值&#xff08;例如&#xff0c;将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式&#xff09;&#xff0c;可以使用 导出为纯文本文件 的功能。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Wir…

docker部署单机版doris,完整无坑

文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时&#xff0c;需要将 Linux 操作系统的内核参数设置为2000000&#xff0c;这里是Doris…

STM32 低功耗模式

目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…

网络安全架构战略 网络安全体系结构

本节书摘来自异步社区《网络安全体系结构》一书中的第1章&#xff0c;第1.4节&#xff0c;作者【美】Sean Convery 1.4 一切皆为目标 网络安全体系结构 当前的大型网络存在着惊人的相互依赖性&#xff0c;作为一名网络安全设计师&#xff0c;对这一点必须心知肚明。Internet就…

【算法】回溯算法

回溯算法 什么是回溯 人生无时不在选择。在选择的路口&#xff0c;你该如何抉择 ..... 回溯&#xff1a; 是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&am…

Centos安装php-8.0.24.tar

查看系统环境 cat /etc/redhat-release 预先安装必要的依赖 yum install -y \ wget \ gcc \ gcc-c \ autoconf \ automake \ libtool \ make \ libxml2 \ libxml2-devel \ openssl \ openssl-devel \ sqlite-devel yum update 1、下载解压 cd /data/ wget https:/…

机器学习(李宏毅)——RNN

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 二、大纲 引例RNN历史基本思想RNN变形RNN训练 三、引例 学习RNN之前先看一个例子&#xff1a; 假设要做一…

Linux 文件系统inode软硬链接

目录 一、理解文件系统 1、前言 2、磁盘 二、inode 1、创建一个新文件的 4 个操作 三、软硬链接 1、软链接 2、硬链接 3、硬链接的应用 4、软链接的应用 一、理解文件系统 1、前言 在我们电脑文件里&#xff0c;分为打开的文件和未打开的文件&#xff0c;我们在上…

多目标粒子群优化算法-MOPSO-(机器人路径规划/多目标信号处理(图像/音频))

具体完整算法请跳转&#xff1a;多目标粒子群优化算法-MOPSO-&#xff08;机器人路径规划/多目标信号处理&#xff08;图像/音频&#xff09;&#xff09; 多目标粒子群优化算法&#xff08;Multi-Objective Particle Swarm Optimization&#xff0c;MOPSO&#xff09;是一种基…

Unity合批处理优化内存序列帧播放动画

Unity合批处理序列帧优化内存 介绍图片导入到Unity中的处理Unity中图片设置处理Unity中图片裁剪 创建序列帧动画总结 介绍 这里是针对Unity序列帧动画的优化内容&#xff0c;将多个图片合批处理然后为了降低Unity的内存占用&#xff0c;但是相对的质量也会稍微降低。可自行进行…

DAY07 Collection、Iterator、泛型、数据结构

学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…

k8s集群如何赋权普通用户仅管理指定命名空间资源

文章目录 1. 普通用户2. 创建私钥3. 创建 CertificateSigningRequest4. 批准 CertificateSigningRequest5. 创建 kubeconfig6. 创建角色和角色绑定7. 测试 1. 普通用户 创建用户demo useradd demo2. 创建私钥 下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 …