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实现web方式logview的方法
Aug 10 Python
Python进阶-函数默认参数(详解)
May 18 Python
python获取时间及时间格式转换问题实例代码详解
Dec 06 Python
Python类装饰器实现方法详解
Dec 21 Python
Python利用字典破解WIFI密码的方法
Feb 27 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
numpy linalg模块的具体使用方法
May 26 Python
python随机生成库faker库api实例详解
Nov 28 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
关于python中导入文件到list的问题
Oct 31 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
python 6种方法实现单例模式
Dec 15 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程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
vue+element UI实现树形表格
2020/12/29 Vue.js
python实现八大排序算法(2)
2017/09/14 Python
python机器学习库常用汇总
2017/11/15 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
python实现猜拳游戏
2020/03/04 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
Pytorch转tflite方式
2020/05/25 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
总经理办公室主任岗位职责
2013/11/12 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
幼儿园教师备课制度
2014/01/12 职场文书
房地产开盘策划方案
2014/02/10 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
关爱残疾人演讲稿
2014/05/24 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
2015年测量员工作总结
2015/05/23 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
浅析Python实现DFA算法
2021/06/26 Python
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL