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开发的单词频率统计工具wordsworth使用方法
Jun 25 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
Python之时间和日期使用小结
Feb 14 Python
python调用自定义函数的实例操作
Jun 26 Python
python对象转字典的两种实现方式示例
Nov 07 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
python3 deque 双向队列创建与使用方法分析
Mar 24 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 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
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
让 python 命令行也可以自动补全
2014/11/30 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
2020/04/20 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
结束运行python的方法
2020/06/16 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
时尚孕妇装:HATCH Collection
2019/09/24 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
中英双版中文教师求职信
2013/10/27 职场文书
大学信息公开实施方案
2014/03/09 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
离婚协议书怎么写
2014/09/12 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
学困生转化工作总结
2015/08/13 职场文书
python中的sys模块和os模块
2022/03/20 Python
Python利用FlashText算法实现替换字符串
2022/03/31 Python