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中使用tarfile压缩、解压tar归档文件示例
Apr 05 Python
简单介绍Python中利用生成器实现的并发编程
May 04 Python
Python判断直线和矩形是否相交的方法
Jul 14 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Python两个字典键同值相加的几种方法
Mar 05 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
python爬虫框架feapde的使用简介
Apr 20 Python
详解Python为什么不用设计模式
Jun 24 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
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
2014/09/27 PHP
PHP 断点续传实例详解
2017/11/11 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
bootstrap table小案例
2016/10/21 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
微信小程序学习笔记之跳转页面、传递参数获得数据操作图文详解
2019/03/28 Javascript
js实现电灯开关效果
2021/01/19 Javascript
在Mac上删除自己安装的Python方法
2018/10/29 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
详解python实现可视化的MD5、sha256哈希加密小工具
2020/09/14 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
美国滑板店:Tactics
2020/11/08 全球购物
大学生毕业自荐信
2013/10/10 职场文书
行政助理岗位职责
2013/11/10 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
大学生党员自我评价
2015/03/04 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
Linux中如何安装并部署Redis
2022/04/18 Servers
如何Python使用re模块实现okenizer
2022/04/30 Python