「@Author:Runsen」❝

编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化。「---- Runsen」❞

先问你们一个小学问题:「如何求两个整数的最大公约数?」

曾经见过不少的算法题,发现有的并不在数据结构和算法大纲中,而是来源于高中数学。

高中数学在必修三中,有一个非常重要的知识点,叫做「碾转相除法、更相减损术」。

辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至公元前300年前。

在古代,有一个比较出名的数学家,叫做「刘徽」。而更相减损术是我国数学家刘徽的专著《九章算术》中记载的.

碾转相除法

辗转相除是求最大公约数的一种算法。给两个数,我们可以把它组成数对(a,b)

辗转相除法基于如下原理:「两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。」

求a和b的最大公约数,就用ab中较小的数去除另一个数,这个时候会有一个余数,当余数是0的时候,那个较小的数就是最大公约数。

若余数不是0,那么我们用这个余数来替换那个比较大的数,然后以此类推,直到算出最大公约数。

比如,下面我用碾转相除法求100和24的最大公约数,很明显最大公约数就是25。100 = 24 * 4  + 4

24  =  4 * 6  + 0

很显然4和6中,那个较小的数4就是100和24最大公约数。

下面用碾转相除法求55和120的最大公约数,很明显最大公约数就是5。55 = 120 * 0  + 55

120  =  55 * 2  + 10

55 = 10 * 5 + 5

很显然10和5中,那个较小的数5就是55和120最大公约数。

算法的流程图(摘自百度百科)

因此得到设两数为m,n,这里不需要判断两数中谁最大。

求m,n两数的最大公约数的步骤为:

用m除以n,m%n=r(r>=0)。如果r=0,则min(m,n)。

如果r≠0,用n除以r,依此循环,直到r=0结束

下面,我们将使用对碾转相除法进行代码化。def gcd(a, b):

# 如果b是0,退出循环

while b:

# 循环赋值

a, b = b, a%b

return a

print(gcd(100,25)) #25

辗转相除法本质上是一种递归的代码,把求两个大数的公约数gcd(a,b)转化为 求其中较小的数和两数的相除余数的最大公约数gcd(b,a%b),直至b为0,则返回a为求得的最大公约数gcd(gcd(a,b), 0)。

因此可以得到:gcd(a,b) = gcd(b,a%b) = gcd(gcd(a,b), 0)def gcd(a, b):

return gcd(b, a % b) if b != 0 else a

print(gcd(55,120)) #5

下面对Python代码进行Java的代码转化/**

* @author Runsen

* @date 2020/12/9 13:18

*/

public class Gcd{

public static void main(String[] args){

int gcd = gcd(91, 49);

System.out.println(gcd);

}

private static int gcd(int a, int b){

while(b != 0) {

int temp = a % b;

a = b;

b = temp;

}

return a;

}

}

下面对Python代码进行JavaScript的代码转化。function gcd(a, b){

while(b != 0){

temp = a % b;

a = b;

b = temp;

};

return a;

}

console.log((gcd(55,120))) #5

更相减损术

我国早期也有求最大公约数问题的算法,就是更相减损术。

在《九章算术》中有更相减损术求最大公约数的步骤:可半者半之,不可半者,副置分母子之数,以少减多,更相减损,求其等也,以等数约之。

更相减损术来源于数的整除性质:即如果两个整数a、b都能被c整除,那么a与b的差也能被C整除。

比如求98和63的最大公约数。

先看98和63这两个数,因为63不是偶数,所以用大数减去小数,得到98-63=35 , 63-35=28 35-28=7 , 28-7=21 , 21-7=14 , 14-7=7 。

「此时,减数和差相等7」,所以98和63的最大公约数是7。

再比如求260和104的最大公约数。

先看260和104两个数,这两个数都是偶数,所以用2约简得130和52。

约简之后的130和52也都是偶数,继续用2约简得65和26,此时65不是偶数,所以用大数减去小数 65-26=39 , 39-26=13 , 26-13=13。

此时,减数和差相等,再上面约去2个2, 得到的数是13,所以260和104的最大公约数是2×2×13=52。

因此更相减损术不在如下:如果两个整数都是偶数,就使用2约简,直到两个整数不再都是偶数,然后执行第2步。如果两个整数不都是偶数,则直接执行第2步。

用较大的数减去较小的数,如果得到的差恰好等于较小的数,则停止。否则,对较小的数和差值重复这个过程。

第1步中约掉的若干个2和第2步中得到的差的乘积为原来两个整数的最大公约数。

下面,我们将使用对更相减损术进行代码化。'''

@Author:Runsen

@WeChat:RunsenLiu

@微信公众号:Python之王

@CSDN:https://blog.csdn.net/weixin_44510615

@Github:https://github.com/MaoliRUNsen

@Date:2020/12/9

'''

def MaxCommDivisor(m, n):

# 如果两个整数都是偶数,就使用2约简,需要记录约简次数

index = 1

while m % 2 == 0 and n % 2 == 0:

m = m / 2

n = n / 2

index = index * 2

# 用较大的数减去较小的数,因此需要判断m和n的大小,确保m是最大的。

if m

m, n = n, m

# 用较大的数减去较小的数,如果得到的差恰好等于较小的数,则停止。否则,对较小的数和差值重复这个过程。

while m - n != n:

diff = m - n

if diff > n:

m = diff

else:

m = n

n = diff

return n * index

print(MaxCommDivisor(24, 12)) #12

更相减损术和辗转相除法在一千多年前的东方和西方同时被提出,这说明天才的想法总是惊人的相似,人类科技文明的进程也是同步的,这就是算法之美。❝

本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。❞

Reference[1]

传送门~:https://github.com/MaoliRUNsen/runsenlearnpy100

- END -

更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起相关推荐

  1. 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...

  2. 【Microsoft Azure 的1024种玩法】五十九.基于Azure云平台快速搭建GitLab应用实现代码托管

    [简介] GitLab是由GitLab Inc.开发,一款基于Git的完全整合的软体开发平台,以 Git 作为代码管理工具并实现自托管的 Git 项目仓库,本篇文章主要介绍如何在Azure Virtu ...

  3. c语言碾转相除法,从高中碾转相除法、更相减损术算法谈起

    编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾经见过不少的算法题,发现有的并不在数据 ...

  4. 【Microsoft Azure 的1024种玩法】五十. 通过Azure文件共享将Azure File 挂载到本地机器实现文件实时共享

    [简介] Azure 文件是 Microsoft 推出的易用云文件系统. Azure 文件共享可以在 Windows 和 Windows Server 中无缝使用. 本文介绍如何通过Azure文件共享 ...

  5. 【Microsoft Azure 的1024种玩法】五十四. 十分钟快速上手创建部署Azure speech服务

    [简介] Azure语音服务是Microsoft提供稳定可靠的云通信服务,其在单个 Azure 订阅中统合了语音转文本.文本转语音以及语音翻译功能,我们可以通过各种方式(语音 CLI.语音 SDK.S ...

  6. 中国五十六个民族简介

    56个民族是中华人民共和国灿烂星空中(五十六个星座). 中华民族共包括56个民族,汉族是中国的主体民族,占全部人口的91.51%,其他还有55个民族,占8.49%(第六次人口普查).汉族和55个少数民 ...

  7. Gradle 2.0 用户指南翻译——第五十六章. 多项目构建

    本文禁止w3cschool转载! 翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc . 本文翻译所在分支:https://github.com/m ...

  8. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  9. 五十六、Fluent空化模型理论

    1. 三种空化模型介绍 恒温下的液体当内部压力较小时低于饱和蒸汽压,液体可能会气化形成空腔,这一过程称为空化cavitation.在这种过程中,空化区会发生非常陡峭的密度变化. Fluent中提供了三 ...

最新文章

  1. Html5 aside标签的用法和作用
  2. java基础提升篇:深入浅出Java多线程
  3. 【机器学习】扎实入门机器学习的路子
  4. spring图片转视频_一直在用的 Spring,你知道它的加载原理吗?
  5. AngularJS学习!
  6. 线程基础知识_Synchronized_ThreadAPI_自定义锁_获取线程运行时异常
  7. “我xx岁了,想学软件测试,现在转行来得及吗?”别再问了,这篇文章终结此类问题
  8. 《数据科学家修炼之道》笔记
  9. Python 基础课程第十一天
  10. Cocos BabeLua配置
  11. matlab费曼编码输入,多点格林函数数值积分(费曼参数积分)的程序分析及应用
  12. 2014年三维地理信息系统 研究成果
  13. 【呆瓜学maven】Maven介绍(创建工程项目以及下载所需要的jar包)
  14. java防止注册刷短信攻击_java面试(1)如何防止恶意攻击短信验证码接口
  15. 浅谈Vue渐进式的理解
  16. Code Review的基本思路
  17. node快速搭建后台
  18. 统计机器学习【3】- K近邻法(三)Ball Tree
  19. win10进程太多怎么优化_win10隐藏进程 谁有win10隐藏进程软件或者怎么隐藏
  20. 「可解释知识图谱推理」最新方法综述

热门文章

  1. Kyuubi 实践 | Apache Kyuubi on Spark 在CDH上的深度实践
  2. 人人都可免费定制微信红包封面,无需审核!
  3. 2021年黄冈副高考试成绩查询,2021年黄冈中考成绩排名查询,黄冈中考个人成绩排名查询...
  4. 别人电脑连不上我的swagger,自己能连
  5. GaussDB(DWS) 数据仓库服务核心技术
  6. SHELL笔记(二)
  7. 互联网晚报 | 马斯克私人飞机降落北京;​英伟达成全球市值最高芯片公司;快播公司已破产注销...
  8. C++找出二维数组中的鞍点
  9. 2011年春节前,我在长沙市岳麓区购房了。
  10. linux存储安装教程,在Linux下安装Pngquant的三种方法:从存储库,源代码及使用Cargo安装...