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 相关文章推荐
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
深入学习Python中的装饰器使用
Jun 20 Python
Python计算两个日期相差天数的方法示例
May 23 Python
python方向键控制上下左右代码
Jan 20 Python
python 实现登录网页的操作方法
May 11 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
python如何实现单链表的反转
Feb 10 Python
Python datetime 格式化 明天,昨天实例
Mar 02 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
Matplotlib绘制混淆矩阵的实现
May 27 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
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
纯js模仿windows系统日历
2017/02/04 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
简介Django中内置的一些中间件
2015/07/24 Python
pycharm设置注释颜色的方法
2018/05/23 Python
对python中dict和json的区别详解
2018/12/18 Python
python实现windows壁纸定期更换功能
2019/01/21 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python Http请求json解析库用法解析
2020/11/28 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
公司授权委托书范本
2014/04/03 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
2016年国陪研修感言
2015/11/18 职场文书
2019军训心得体会
2019/06/27 职场文书