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之编写类之二方法
Oct 11 Python
python开启多个子进程并行运行的方法
Apr 18 Python
Python创建模块及模块导入的方法
May 27 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
python实现的爬取电影下载链接功能示例
Aug 26 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
让你相见恨晚的十个Python骚操作
Nov 18 Python
Python: glob匹配文件的操作
Dec 11 Python
Python Selenium库的基本使用教程
Jan 04 Python
python 获取谷歌浏览器保存的密码
Jan 06 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 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中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
js打造数组转json函数
2015/01/14 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python内置模块turtle绘图详解
2017/12/09 Python
Python生成器以及应用实例解析
2018/02/08 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
谈谈Python中的while循环语句
2019/03/10 Python
python文件写入write()的操作
2019/05/14 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
PyQt 图解Qt Designer工具的使用方法
2019/08/06 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
店长岗位的工作内容
2013/11/12 职场文书
《春天来了》教学反思
2014/04/07 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技
Go语言入门exec的基本使用
2022/05/20 Golang