从原理到实践:详解辗转相除法(欧几里得算法)
创作时间:
作者:
@小白创作中心
从原理到实践:详解辗转相除法(欧几里得算法)
引用
CSDN
1.
https://blog.csdn.net/case_break/article/details/142426462
辗转相除法,又称欧几里得算法,是一种用于计算两个正整数最大公约数的算法。本文将从原理到实践,深入探讨这一经典算法。
辗转相除法原理
计算步骤
辗转相除法的基本步骤如下:
- 给定两个正整数a和b(a > b)
- 计算a除以b的余数c
- 将b赋值给a,将c赋值给b
- 重复步骤2和3,直到余数为0。此时的b即为最大公约数
图形理解
通过树形图可以更直观地理解辗转相除法的计算过程:
在这个图中,蓝色部分表示初始数据。除根节点外,每层节点左边是除数,右边是余数,每层数值加起来等于父节点的值,每层的余数是下一层的除数。
公式推导
假设 a % b = R1,则 a = n1 * b + R1
假设 b % R1 = R2,则 b = n2 * R1 + R2
……
一直往下算可以发现,所有数值关系都可以由余数R1、R2 … Rn来表达。当Rn与Rn-1存在倍数关系后,Rn就可以通过倍数关系表达初始数据a和b。
代码实现
接下来,我们通过一个LeetCode题目来实践辗转相除法的应用:
题目:找出数组的最大公约数
给你一个整数数组 nums ,返回数组中最大数和最小数的最大公约数。
两个数的最大公约数是能够被两个数整除的最大正整数。
class Solution {
public int findGCD(int[] nums) {
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for(int i = 0 ; i < nums.length; i++){
if(nums[i] > max){
max = nums[i];
}
if(nums[i] < min){
min = nums[i];
}
}
return realFindGCD(max, min);
}
//通过递归计算a、b的最大公约数
public int realFindGCD(int a, int b){
if(a % b == 0){
return b;
}
return realFindGCD(b, a%b);
}
}
这段代码首先找到数组中的最大值和最小值,然后通过递归函数realFindGCD计算这两个数的最大公约数。递归函数的核心逻辑是:如果a能被b整除,则b就是最大公约数;否则,继续用b和a%b进行递归计算。
总结
辗转相除法是一个简单而优雅的算法,通过递归或循环都能很好地实现。它不仅在数学中有广泛应用,在计算机科学中也是基础算法之一。理解其原理和实现方法,对于提升算法思维大有裨益。
热门推荐
详解上海住房公积金贷款需要的材料
配置Claude Desktop连接本地SQLite数据库和文件系统
个人无犯罪记录证明申请全解析:流程、法律依据与实务要点
“天涯何处无芳草”出自哪里?《蝶恋花·春景》背后故事介绍!
抗菌产品真抗菌吗?教您辨别真假,不花冤枉钱
汉文帝用四个字的管理方式,将汉朝推向治世,奠定了“强汉”基础
黄帝之女旱魃:传说中的旱神与神兽“犼”之谜
如何在Windows中修复Chrome的页面加载缓慢问题
广西十大特色早餐:从米粉到糯米饭,品味广西独特饮食文化
个人电子邮箱使用全攻略:从填写格式到安全防护
手突然很痒是怎么回事?原因分析与护理建议
中国歼16和美国F15EX,谁才是最强的重型四代战斗机?
眉山三日游:自然与文化的完美邂逅
长期持有股票的风险与收益
三叉神经痛中药配方:川芎止痛汤、散偏定痛饮、三叉汤
懂了八纲辩证,你就算中医入门了
近视科普|为什么说充足的睡眠是近视防控的一剂良药?
伺服电机编码器怎么选型
沙盘:创造力与情感表达的独特工具,助力心理治疗与团队建设
90后北大校友破解挂谷猜想,陶哲轩激动转发!网友:预定菲尔兹奖
Win10关闭更新后仍自动更新?这些方法帮你彻底解决
智慧肉羊产业链:科技如何提升养殖效率
幻灵详解-洛朗
物联网太阳能离网系统解决方案
黄芪白茯苓泡水的功效
胃胀应该吃什么食物比较好
定制化人才培养方案如何满足企业实际需求?
羽毛球拍材质全解析:从木拍到碳纤维,哪种材质最适合你?
房子窗户的隔音应如何实现?这种隔音方法有哪些材料选择?
消防喷淋头的工作原理及开式和闭式的区别是什么