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编写检测数据库SA用户的方法
Jul 11 Python
Python实现简单过滤文本段的方法
May 24 Python
python2.7实现FTP文件下载功能
Apr 15 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
关于python写入文件自动换行的问题
Jun 23 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
详解python中的time和datetime的常用方法
Jul 08 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
python类的实例化问题解决
Aug 31 Python
Python计算IV值的示例讲解
Feb 28 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
什么是Python变量作用域
Jun 03 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基础学习笔记
2007/03/18 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
PHP中的类型约束介绍
2015/05/11 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python 全文检索引擎详解
2017/04/25 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
Python Gitlab Api 使用方法
2019/08/28 Python
浅析使用Python搭建http服务器
2019/10/27 Python
python中的yield from语法快速学习
2020/11/06 Python
实习自我鉴定模板
2013/09/28 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
报到证办理个人委托书
2014/10/06 职场文书
初中作文评语集锦
2014/12/25 职场文书
后进生评语大全
2015/01/04 职场文书
入党申请书怎么写?
2019/06/21 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
Redis IP地址的绑定的实现
2021/05/08 Redis
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS
教你如何用cmd快速登录服务器
2022/06/10 Servers