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代码
Mar 13 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
python求最大连续子数组的和
Jul 07 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
python 格式化输出百分号的方法
Jan 20 Python
Python3最长回文子串算法示例
Mar 04 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
python中not、and和or的优先级与详细用法介绍
Nov 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数据缓存的使用说明
2013/05/10 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
js实现简易聊天对话框
2017/08/17 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
[01:35:53]完美世界DOTA2联赛PWL S3 Magma vs GXR 第二场 12.13
2020/12/17 DOTA
Python导入txt数据到mysql的方法
2015/04/08 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
保洁主管岗位职责
2013/11/20 职场文书
教师申诉制度
2014/01/29 职场文书
八一建军节部队活动方案
2014/02/04 职场文书
网络管理专业求职信
2014/03/15 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年教师工作总结
2014/11/10 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python