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 相关文章推荐
win7 下搭建sublime的python开发环境的配置方法
Jun 18 Python
Python中的闭包实例详解
Aug 29 Python
python选择排序算法实例总结
Jul 01 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
Feb 11 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
Python 如何对文件目录操作
Jul 10 Python
Python数据模型与Python对象模型的相关总结
Jan 26 Python
python 实现体质指数BMI计算
May 26 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排序算法实例分析
2016/10/17 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
NodeJs通过async/await处理异步的方法
2017/10/09 NodeJs
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
python使用udp实现聊天器功能
2018/12/10 Python
python使用插值法画出平滑曲线
2018/12/15 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
pip install命令安装扩展库整理
2021/03/02 Python
美国最大点评网站:Yelp
2018/02/14 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
周鸿祎:教你写创业计划书
2013/12/30 职场文书
老干部座谈会主持词
2015/07/03 职场文书
golang 语言中错误处理机制
2021/08/30 Golang