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 re正则表达式模块(Regular Expression)
Jul 16 Python
python time模块用法实例详解
Sep 11 Python
详细介绍Python函数中的默认参数
Mar 30 Python
Python中的异常处理简明介绍
Apr 13 Python
在Python中操作时间之mktime()方法的使用教程
May 22 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
十行代码使用Python写一个USB病毒
Jun 21 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
python根据多个文件名批量查找文件
Aug 13 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
GitHub上值得推荐的8个python 项目
Oct 30 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 七大优势分析
2009/06/23 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
php中文繁体和简体相互转换的方法
2015/03/21 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
JavaScript的this关键字的理解
2016/06/18 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
js实现放大镜特效
2017/05/18 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
django orm模块中的 is_delete用法
2020/05/20 Python
python实例化对象的具体方法
2020/06/17 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
Paul’s Boutique官网:英国时尚手袋品牌
2018/03/31 全球购物
工程专业求职自荐书范文
2014/02/18 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
营业员岗位职责
2015/02/11 职场文书
匿名检举信范文
2015/03/02 职场文书