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

一、生活中的公约数应用

在日常生活中,经常需要处理"均分分配"问题。例如:要将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.mzph.cn/web/70132.shtml

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

相关文章

NCHAR_CS和CHAR_CS,导致UNION ALL 时,提示SQL 错误 [12704] [72000]: ORA-12704: 字符集不匹配

检查涉及的数据表和列的字符集设置 -- 查询表的字符集 SELECT parameter, value FROM nls_database_parameters WHERE parameter LIKE NLS_CHARACTERSET;-- 查询列的字符集&#xff08;对于特定表&#xff09; SELECT column_name, character_set_name FROM all_tab_columns W…

算法之 跳跃游戏

文章目录 55.跳跃游戏思路参考&#xff1a;56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析&#xff1a; 两种思路&#xff0c;思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr&#xff0c;如果i>mr就说明无法到达i,否则就是可以到达&#xff1b;…

在C#中动态访问对象属性时,用表达式树可以获得高效性能

在C#中如何用表达式树动态访问对象属性的问题。用户可能已经知道反射的基本用法&#xff0c;但想用表达式树来提高性能&#xff0c;因为表达式树编译后的委托执行速度比反射快。 首先&#xff0c;表达式树的基本概念。表达式树允许在运行时构建代码&#xff0c;并编译成可执行的…

深入解析 Flutter 性能优化:从原理到实践

深入解析 Flutter 性能优化&#xff1a;从原理到实践的全面指南 Flutter 是一个高性能的跨平台框架&#xff0c;但在开发复杂应用时&#xff0c;性能问题仍然可能出现。性能优化是开发高质量 Flutter 应用的关键。本篇博客将从 Flutter 的渲染原理出发&#xff0c;结合实际场景…

使用 Python 爬虫获取微店快递费用 item_fee API 接口数据

在电商运营中&#xff0c;快递费用是影响商家利润和用户体验的重要因素之一。微店作为国内知名的电商平台&#xff0c;提供了丰富的 API 接口供开发者使用&#xff0c;其中也包括查询商品快递费用的接口。通过调用微店的 item_fee 接口&#xff0c;开发者可以获取指定商品的快递…

MySQL基本操作——包含增删查改(环境为Ubuntu20.04,MySQL5.7.42)

1.库的操作 1.1 创建数据库 语法&#xff1a; 说明&#xff1a; 大写的表示关键字 [] 是可选项 CHARACTER SET: 指定数据库采用的字符集 COLLATE: 指定数据库字符集的校验规则 1.2 创建案例 创建一个使用utf8字符集的db1数据库 create database db1 charsetutf8; …

Spring Boot 定时任务:轻松实现任务自动化

在现代应用开发中&#xff0c;定时任务是一个常见的需求。比如&#xff0c;我们可能需要定时清理过期数据、定时发送邮件通知等。 操作流程 开启定时任务注解 在启动类添加注解EnableScheduling 设置时间&#xff08;固定时间间隔&#xff09; 使用 Scheduled 注解创建定时…

七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持

本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容&#xff0c;助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目&#xff0c;该版本修复了原版中的多个 系统漏洞&#…

【Rust中级教程】1.12. 生命周期(进阶) Pt.2:生命周期变型、协变、不变、逆变

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 这篇文章在Rust初级教程的基础上对生命周期这一概念进行了补充&#xff0c;建议先看【Rust自…

Vue 项目登录的基本流程

Vue 用户登录的基本流程包括以下6个步骤&#xff1a; 步骤&#xff1a; 1. 创建登录表单 在前端&#xff0c;首先要创建一个登录表单&#xff0c;用户输入账号&#xff08;用户名、邮箱、手机号等&#xff09;和密码。 示例&#xff1a;Login.vue <template><div…

【算法】回溯算法

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

SpringAI系列 - RAG篇(三) - ETL

目录 一、引言二、组件说明三、集成示例一、引言 接下来我们介绍ETL框架,该框架对应我们之前提到的阶段1:ETL,主要负责知识的提取和管理。ETL 框架是检索增强生成(RAG)数据处理的核心,其将原始数据源转换为结构化向量并进行存储,确保数据以最佳格式供 AI 模型检索。 …

2025 docker可视化管理面板DPanel的安装

1.什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&#xff1a;提供直观的用户界面&#…

基于Python的深度学习音乐推荐系统(有配套论文)

音乐推荐系统 提供实时音乐推荐功能&#xff0c;根据用户行为和偏好动态调整推荐内容 Python、Django、深度学习、卷积神经网络 、算法 数据库&#xff1a;MySQL 系统包含角色&#xff1a;管理员、用户 管理员功能&#xff1a;用户管理、系统设置、音乐管理、音乐推荐管理、系…

微信小程序---计划时钟设计与实现

微信小程序-计划时钟已上线,欢迎各位小伙伴的测试和使用~(微信小程序搜计划时钟即可使用) 在这篇博客中,我们将探讨如何在微信小程序中设计和实现一个任务管理功能,该功能允许用户添加、删除和查看任务。任务管理系统的核心是基于日期和时间的任务管理,可以设置任务的开…

RPA-实例(UiPath )

UiPath 是一个流行的机器人流程自动化(RPA)工具,用于自动化重复性任务。以下是一个简单的实例,展示如何使用 UiPath 自动化一个常见的任务:从 Excel 文件中读取数据并将其输入到网页表单中。 实例:从 Excel 读取数据并自动填写网页表单 步骤 1:准备工作 安装 UiPath S…

华为固态电池引发的思索

华为固态电池真牛&#xff01; 超长续航&#xff1a;单次充电即可行驶3000公里 极速充电&#xff1a;五分钟内充满80% 极致安全&#xff1a;不可燃、不漏液 长寿命设计&#xff1a;循环寿命达10000次以上 如上是华为电池展示的优势项&#xff0c;每一条都让我们心动不已。…

算法分析—— 《归并排序》

《排序数组》 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2…

UEFI Spec 学习笔记---11 - Protocols — UEFI Driver Model(1)

11.UEFI Driver Model 遵循 UEFI model 的 EFI driver 是不允许去遍历所有的 controller 来识别需要安装到哪个 controller 上的&#xff0c;而是通过 EFI_BOOT_SERVICES 的 ConnectController 和调用 Binding Driver 来实现&#xff1b; 具体实现如下&#xff1a; CoreConne…

10G EPON光模块

一、10G EPON对称光模块 工作模式&#xff1a;上行突发接收、下行连续发射。 工作原理&#xff1a;当需要发送信号时&#xff0c;系统信号通过光模块的电接口把信号传送到驱动芯片&#xff0c;芯片处理后&#xff0c;驱动激光器发出调制光信号&#xff0c;经光纤发到远端&…