Python基于更相减损术实现求解最大公约数的方法


Posted in Python onApril 04, 2018

本文实例讲述了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))

运行结果:

Python基于更相减损术实现求解最大公约数的方法

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

首先,除的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))

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

Python基于更相减损术实现求解最大公约数的方法

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

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

在线一元函数(方程)求解计算工具:
http://tools.3water.com/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.3water.com/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.3water.com/jisuanqi/jsq

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

Python 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 Python
python使用正则表达式匹配字符串开头并打印示例
Jan 11 Python
用python与文件进行交互的方法
Mar 01 Python
Python中垃圾回收和del语句详解
Nov 15 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
详解基于python的多张不同宽高图片拼接成大图
Sep 26 Python
python路径的写法及目录的获取方式
Dec 26 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
django从后台返回html代码的实例
Mar 11 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
Python reduce函数作用及实例解析
May 08 Python
Python遍历numpy数组的实例
Apr 04 #Python
基于Python中numpy数组的合并实例讲解
Apr 04 #Python
python实现list由于numpy array的转换
Apr 04 #Python
pyhton列表转换为数组的实例
Apr 04 #Python
Python实现二维数组输出为图片
Apr 03 #Python
分享Pycharm中一些不为人知的技巧
Apr 03 #Python
基于python 二维数组及画图的实例详解
Apr 03 #Python
You might like
用libtemplate实现静态网页生成
2006/10/09 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
php四种基础算法代码实例
2013/10/29 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
javascript淘宝主图放大镜功能
2016/10/20 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
vue接口请求加密实例
2020/08/11 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Django查询数据库的性能优化示例代码
2017/09/24 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
python中rb含义理解
2020/06/18 Python
python高级特性简介
2020/08/13 Python
毕业生怎样写好自荐信
2013/11/11 职场文书
教师实习自我鉴定
2013/12/18 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
小王子读书笔记
2015/06/29 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
python 判断文件或文件夹是否存在
2022/03/18 Python