本文实例讲述了Python基于更相减损术实现求解最大公约数的方法。分享给大家供大家参考,具体如下:

先从网上摘录一段算法的描述如下:

更相减损法:也叫 更相减损术,是出自《 九章算术》的一种求最大公约数的算法,它原本是为 约分而设计的,但它适用于任何需要求最大公约数的场合。

《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”

翻译成现代语言如下:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

看完上面的描述,我的第一反应是这个描述是不是有问题?从普适性来说的话,应该是有问题的。举例来说,如果我求解4和4的最大公约数,可半者半之之后,结果肯定错了!后面的算法也不能够进行!

不管怎么说,先实现一下上面的算法描述:

# -*- coding:utf-8 -*-

#! python2

def MaxCommDivisor(m,n):

# even process

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

m = m / 2

n = n / 2

# exchange order when needed

if m < n:

m,n = n,m

# calculate the max comm divisor

while m - n != n:

diff = m - n

if diff > n:

m = diff

else:

m = n

n = diff

return n

print(MaxCommDivisor(55,120))

print(MaxCommDivisor(55,77))

print(MaxCommDivisor(32,64))

print(MaxCommDivisor(16,128))

运行结果:

不用说,上面程序执行错误百出。那么该如何更正呢?

首先,除的2最终都应该再算回去!这样,程序修改如下:

def MaxCommDivisor(m,n):

com_factor = 1

if m == n:

return n

else:

# process for even number

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

m = int(m / 2)

n = int(n / 2)

com_factor *= 2

if m < n:

m,n = n,m

diff = m - n

while n != diff:

m = diff

if m < n:

m,n = n,m

diff = m - n

return n * com_factor

print(MaxCommDivisor(55,120))

print(MaxCommDivisor(55,77))

print(MaxCommDivisor(32,64))

print(MaxCommDivisor(16,128))

通过修改,上面程序执行结果如下

虽说这段程序写出来看着有点怪怪的,但是总体的算法还是实现了。与辗转相除等算法相比,这个在循环的层级上有一定的概率会减小。特别是最后的两组测试数字对儿,这种情况下的效果要好一些。但是,总体上的算法的效率,现在我还不能够给个准确的衡量。

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

希望本文所述对大家Python程序设计有所帮助。

更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法相关推荐

  1. java 调用wget_通过命令行执行WGET下载会更快,而通过Java代码执行时会更慢

    我正在使用WGET通过java代码下载文件,这需要大约10分钟才能下载20 MB文件.但是通过命令行执行wget下载,同样的文件以10MbPs的速度在7秒内下载.有人知道为什么吗?我该如何改进我的Ja ...

  2. Java代码访问基于https安全协议的网站或服务器

    Java代码访问基于https安全协议的网站或服务器, 一般分为有证书和无证书两种,无证书的大部分都很简单,说一下我遇到的有证书的: 证书类型:pfx,(个人证书带密码) 服务器配置:基于SSL加密模 ...

  3. python辗转相除_Python基于辗转相除法求解最大公约数的方法示例

    Python基于辗转相除法求解最大公约数的方法示例 本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其 ...

  4. python辗转相除法求最大公约数的递归函数_Python基于辗转相除法求解最大公约数的方法示例...

    本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法修改要求实现的是辗转相除法求解最大公 ...

  5. python辗转相除法求最大公约数、最小公倍数_Python使用辗转相除法求解最大公约数的方法示例...

    本文实例讲述了Python使用辗转相除法求解最大公约数的方法.共享给大家供大家参考,详细如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法改要求实现的是辗转相除法求解最大公约 ...

  6. python辗转相除法求最大公约数最小公倍数_Python基于辗转相除法求解最大公约数的方法示例...

    本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法修改要求实现的是辗转相除法求解最大公 ...

  7. 线性查找法java代码_Java线性查找和二分查找

    Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...

  8. 运行sql快还是java代码快,让Java代码跑得更快

    1.将一些系统资源放在池中,如数据库连 接,线程等.在standalone的应用中,数据库连接池可以使用一些开源的连接池实现,如C3P0,proxool和DBCP等,在运行在容器中的应 用这可以使用服 ...

  9. java 日期的加减_用java实现日期类的加减

    Java代码 public class test1 { public static void main(String[] args) { Calendar c = Calendar.getInstan ...

最新文章

  1. 人机语言(MML: Man-Machine Language)
  2. javascript onmouseout问题解决方案
  3. ngx_pagespeed加速nginx
  4. 概率论 第三章 多维随机变量及其分布
  5. Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
  6. jpa原生query_JPA执行原生SQL语句
  7. 乐视跳过服务器验证,pandwonload不能登录?试试跳过启动验证
  8. Hbase CallQueueTooBigException 异常处理
  9. 太难了,斯坦福AI报告曝光!全球190万会AI,中国有5万
  10. oracle raw如何生成,如何使用raw device构建Oracle数据库
  11. mysql临时表多线程时能用吗_学会使用临时表优化,切记不要乱用临时表(记录一)...
  12. linux维文字体如何下载,uyghurfont
  13. 【项目实战】别出心裁的小程序简历,让面试官耳目一新(第一个自己独立完成的小程序)
  14. css实现文本溢出时显示省略号(单行)
  15. java while 死循环_java while (true) 死循环
  16. 每日一课 | AES加密和解密(CBC模式)
  17. 考虑结构预应力的坎贝尔图分析
  18. 阿里M8每天肝到凌晨,竟是只为一份文档把分布式到微服务讲清楚
  19. 每日算法_4月11日_02
  20. 豆瓣APP上线7.0新版本,从工具到社区的进化之路

热门文章

  1. 百度移动玩“智能”嗨了,PC百度卫士也“按捺不住”了?
  2. html获取文本框光标位置,html 在编辑框中如何定位光标和获取光标最后位置
  3. 汽车安全攻击篇:智能网联系统的短板,如何防护汽车的安全
  4. 曼达洛人对机器人的评价_机器人作文评语大全
  5. Android ProgressBar控件
  6. FZU 1922 非主流
  7. 基克的聚合 机器人_lol机器人出装?lol机器人辅助出装2020
  8. JavaScript动画性能优化
  9. NFD开发指南-2.Face系统
  10. PHP垃圾回收机制----引用计数基础知识