带你理解求最大公因数的算法

前言:在数学学习与计算机编程中,我们经常需要计算两个数字的最大公约数。它既能简化分数计算,也是密码算法、数据运算里最 基础的常用在数学学习与计算机编程中,我们经常需要计算两个数字的最大公约数。它既能简化分数计算,也是密码算法、数据运算里最基础的常用工具。

从古至今,人们总结出两种最经典、流传最广的求解方法:更相减损术与辗转相除法。两种算法底层逻辑相通,都依靠数字公因数不变的数学规律缩小数值,但运算方式、速度效率截然不同。

本文用最简单直白的语言,不带复杂公式,一步步拆解两种算法的原理、过程与优劣对比,带你彻底看懂古人智慧与现代最优解法的区别。

<1>更相减损术

#include <stdio.h>
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    while(m!=n)
    {
        while(m>n){m=m-n;}
        while(n>m){n=n-m;}
    }
    printf("%d\n",m);
    return 0;
}

1.先引入一个知识,两个数的公因数不会,因为两者相减而改变,列如两个数m , n 他们的公约数是d , m-n的公约数也是d

2.上面代码意思就是,输入两个值,大数-小数的差值,赋予给大值 乍一看!有点看不懂!

举个例子:(24 9) --- (15 9) --- (6 9) --- (6 3) --- (3 3) : (12 4) --- (8 4) --- (4 4)

24 9 的最大公约数是3 12 4 的最大公约数是4

3.首先两个数相减,公约数d一直存在 (如12与4 有1,2,4) , 只是说把数的范围减小了 懂这意思吗? 找数更好找了

然而为什么m != n 其实就是确定(锁定)最大公约数,原理是,越大的公约数数字越早重合,越早停止循环(减的过程公约数会出来)

4.为什么减的过程公约数会出来呢?比如12 4两个数, 12可以由3个4组成 , 4可以由1个4组成 ,那不就公约数不就出来了,应该可以理解

<2>辗转相除法

#include <stdio.h>
int main()
{
    int m, n, t;
    scanf("%d%d", &m, &n);
    while(n != 0)
    {
        t = m % n;
        m = n;
        n = t;
    }
    printf("%d\n", m);
    return 0;
}

1.为什么先引入更相减损术?这是因为更相减损术的原理和辗转相除法的原理是一样的公约数不变,只是减法 变 批量减法 , 速度更很快

2.取余 = 一次性多次减法

如(24 9) --- (9 6) --- (6 3) --- (3 3) {这里要注意m = n与n = t} 这跟上面本质没什么区别啦

m n m n m n m n

3.这里还有一个区别的话,就是结束条件不同,为什么余数为0就结束了?

其一 我们知道大数与小数,如果说大数能够被小的数整除,那小的数就是它们的最大公因数(这个方法的本质)

那(12 9)举例 , 12%9=3 ---->(9 3)然后可以整除了,最大公约数就出来了

其二 取余%的步骤包含两个作用a.缩小范围 b.确定整除,一旦能够确定整除,那么就可以得到最大公约数

总结

一.更相减损术(减法版)

核心思想:

两个数一起变小,公因数永远不会消失。

只要两数不相等,就一直用大数减小数。数字会越来越接近,直到两个数完全相同。最后相等的数,就是最大公约数。

缺点:数字差距很大时,减法次数太多,计算很慢。

二.辗转相除法(取余%版,最优)

核心思想:

取余就是一次性连续减法,一步顶很多次相减。

用大数对小数取余数,再不断替换数字重复运算。直到余数变成0,此时剩下的数就是最大公约数。

优点:步骤极少、速度最快,是目前数学和编程公认最好用的标准方法。

三.本质

两种算法本质一模一样:公因数全程不变,只会保留最大公共因数。

减法温和易懂,适合理解原理;取余高效快速,适合实际做题与代码使用。

全部评论

相关推荐

40min,无算法,没开摄像头,面试体验也不太好,kpi感很强,对面死气沉沉的,每次回答完都有挺长时间延迟,有点像是AI一样,回答不太了解的还得追着问,已挂。1.&nbsp;毕业设计做的怎么样了(奇怪的问题2.&nbsp;项目上线了吗,是自己设计的吗,怎么设计的,架构3.&nbsp;对DDD的理解,分层架构,依赖倒置4.&nbsp;HTTP和RPC区别5.&nbsp;微信登录鉴权有哪些接口,叫什么6.&nbsp;项目域名怎么配置的,怎么绑定ip的,怎么配置的SSL,为什么要用HTTPS,HTTPS安全在哪7.&nbsp;Lua怎么保证原子性,和Redis事务区别8.&nbsp;如果lua&nbsp;a,b,c,d,e&nbsp;执行完a,b后c出错了会发生什么,那a,b执行了不回滚怎么处理9.&nbsp;Redis&nbsp;Pub/Sub,为什么不用MQ(项目相关10.&nbsp;RocketMQ怎么保证有序性11.&nbsp;压测QPS,瓶颈,服务器配置12.&nbsp;为什么下单接口QPS低,是因为写了数据库吗(这里不理解,总不能写Redis吧13.&nbsp;恶意请求如同一订单退单一万次怎么处理,怎么实现幂等性校验14.&nbsp;项目数据库表几张,都有什么字段,建立了什么索引15.&nbsp;怎么做的库存管理16.&nbsp;项目怎么编译的17.&nbsp;Linux熟悉吗(不熟悉,怎么查看进程,CPU,负载,压测看了什么字段,top有什么,怎么找到一个在运行的项目18.&nbsp;用什么AI工具,怎么用,怎么验证代码,AI上下文怎么做管理(不会,一直追着杀19.&nbsp;黑盒测试白盒测试20.&nbsp;gateway怎么做的服务发现,泛化调用怎么用,原理21.&nbsp;HTTP状态码22.&nbsp;网关调用后端服务失败是为什么,怎么处理
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务