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的Flask框架中@app.route的用法教程
Mar 31 Python
Python中处理时间的几种方法小结
Apr 09 Python
python实现可将字符转换成大写的tcp服务器实例
Apr 29 Python
Python实现删除文件中含“指定内容”的行示例
Jun 09 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
浅析Python迭代器的高级用法
Jul 16 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
python list等分并从等分的子集中随机选取一个数
Nov 16 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
Jupyter Notebook内使用argparse报错的解决方案
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
我的论坛源代码(一)
2006/10/09 PHP
php session安全问题分析
2011/06/24 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
jQuery遍历Form示例代码
2013/09/03 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
2021/01/15 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
高校自主招生自荐信
2013/12/09 职场文书
廉政教育心得体会
2014/01/01 职场文书
电子商务专业求职信
2014/03/08 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android