求最大公约数算法_求最大公约数最快方法

求最大公约数算法_求最大公约数最快方法一写在开头1.1本节内容本节主要内容为几种常见的两个数的最大公约数(GreatestCommonDivisor)的求法。二辗转相除法2.1辗转相除法原理辗转相除法也叫欧几里得算法,是一种非

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一 写在开头
1.1 本节内容
本节主要内容为几种常见的两个数的最大公约数(Greatest Common Divisor)的求法。

二 辗转相除法
2.1 辗转相除法原理
辗转相除法也叫欧几里得算法,是一种非常古老的求解两个数的最大公约数的算法。其基于的原理:两个正整数a和b(a > b),它们的最大公约数gcd等于a除以b的余数r和b之间的最大公约数。比如,10和25的最大公约数5等于25除以10的余数5和10的最大公约数;再比如51和21的最大公约数3等于51除以21的余数9和21的最大公约数,而9和21的最大公约数为3。根据上面的原理,辗转相除法的算法流程可以如下:
步骤1:计算a与b的余数r。
步骤2:如果r为0,则返回gcd = b。否则,转到步骤3。
步骤3:使用b的值更新a的值,使用余数r更新b的值,转到步骤1。

2.2 辗转相除法的C语言实现

1 long GetGCD(long a, long b)
2 {
3     return (a % b == 0) ? b : GetGCD(b, a%b);
4 }

等等,为什么不对a和b的大小进行判断呢?上面的算法原理中不是要求a大于b吗?如果调用时a值大于b值,比如a为51,b为21,那么情况跟上述算法原理是相符的。如果调用时a值小于b值,比如a为21,b为51,那么,21除以51的余数r为21,不为0,于是接着调用GetGCD(51, 21),看到了没?这就和a > b的情况是一样的了。也就是说我们根本无需判断a和b的大小,当a值小于b值时,算法的下一次递归调用就能够将a和b的值交换过来。

2.3 辗转相除法的缺点
辗转相除法实现时因为使用了求余运算的缘故导致其在面对大整数的时候性能不够理想。我们应尽量避免使用求余运算。接下来介绍另一种最大公约数求解法。

三 更相减损术
3.1 更相减损术原理
更相减损术出自《九章算术》,其原理很简单:两个正整数a和b(a > b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。依次递归下去,直到两个数相等。这相等两个数的值就是所求最大公约数。

3.2 更相减损术的C语言实现

1 long GetGCD(long a, long b)
2 {
3     if (a == b)
4         return a;
5     else if (a > b)
6         return GetGCD(a-b, b);
7     else
8         return GetGCD(b-a, a);
9 }

3.3 更相减损术的缺点
更相减损术虽然避免了求余运算,但当两个数a和b相差太过悬殊时,递归的次数会非常多,严重影响算法性能。比如当a为100000,b为1时,算法要递归99999次。

四 终极版本
一般情况下,以上两个版本完全够用。如果追求最佳算法性能的终极版本,那就去看《编程之美》第2.7节吧。

五 参考资料
1. 《编程之美》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166903.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 标准化和归一化,请勿混为一谈,透彻理解数据变换[通俗易懂]

    标准化和归一化,请勿混为一谈,透彻理解数据变换[通俗易懂]标准化与归一化1、标准化(Standardization)和归一化(Normalization)概念1.1、定义1.2、联系和差异一、联系二、差异1.3、标准化和归一化的多种方式2、标准化、归一化的原因、用途3、什么时候Standardization,什么时候Normalization4、所有情况都应当Standardization或Normalization么5、一些其他的数据变换方式5.1、l…

    2022年6月23日
  • Linux开放指定端口命令

    Linux开放指定端口命令1.方式一1、开启防火墙systemctlstartfirewalld2、开放指定端口(比如1935端口)firewall-cmd–zone=public–add-port=1935/tcp–permanent命令含义:–zone#作用域–add-port=1935/tcp#添加端口,格式为:端口/通讯协议–permanent#永久生效,没有此参数重启后失效3、重启防火墙firewall-cmd–reload4、查看..

    2022年9月7日
  • pytest怎么安装_pytest安装

    pytest怎么安装_pytest安装pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

    2022年7月30日
  • java中输出数组元素的方法[通俗易懂]

    java中输出数组元素的方法[通俗易懂]定义一个数组:int[]array=newint{5,2,3,8};方法一:for(inti=0;i<array.length){ System.out.println(array[i]);}方法二:importjava.util.Arrays;System.out.println(Array.toString(array))方法三:…

    2022年10月11日
  • java–接口

    java–接口

    2021年9月29日
  • java 拦截器的作用?

    java 拦截器的作用?转载注明出处~1.拦截器都是做什么的?做的事和请求和响应有关。(比如前端的css或者一些加载的路径都会走这个拦截器)访问日志(记录访客的ip,来源),在线统计人数,字符集转换,身份验证可以不破坏你的业务逻辑在你的业务之外做一些其他事情~.过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求,…

    2022年5月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号