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 获取进程pid号的方法
Mar 10 Python
python中lambda与def用法对比实例分析
Apr 30 Python
Python实现递归遍历文件夹并删除文件
Apr 18 Python
详解Python中的动态属性和特性
Apr 07 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
python 实现对文件夹中的图像连续重命名方法
Oct 25 Python
在Python中增加和插入元素的示例
Nov 01 Python
python用插值法绘制平滑曲线
Feb 19 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 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实现的Captcha验证码类实例
2014/09/22 PHP
PHP自定义多进制的方法
2016/11/03 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
通过JS来动态的修改url,实现对url的增删查改
2014/09/01 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
使用JavaScript获取Request中参数的值方法
2016/09/27 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
python样条插值的实现代码
2018/12/17 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
python装饰器代码深入讲解
2021/03/01 Python
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
大学生的自我鉴定范文
2014/01/21 职场文书
中文教师求职信
2014/02/22 职场文书
商业项目策划方案
2014/06/05 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
Python 如何实现文件自动去重
2021/06/02 Python