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脚本来删除指定容量以上的文件的教程
May 04 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python select.select模块通信全过程解析
Sep 20 Python
如何用python整理附件
May 13 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
Python线程同步的实现代码
Oct 03 Python
Python函数和模块的使用总结
May 20 Python
Python调用Windows命令打印文件
Feb 07 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
Python中的__init__作用是什么
Jun 09 Python
如何编写python的daemon程序
Jan 07 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 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 Session及如何保持其不过期的方法
2015/08/18 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
js动态为代码着色显示行号
2013/05/29 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
代码整洁之道(重构)
2018/10/25 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python fileinput模块使用实例
2015/05/28 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
python装饰器实例大详解
2017/10/25 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
python三引号如何输入
2020/07/06 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
初婚未育证明
2014/01/15 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
2014年女职工工作总结
2014/11/27 职场文书
母亲节感言
2015/08/03 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis