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生成随机密码的方法
Jun 16 Python
Python实现完整的事务操作示例
Jun 20 Python
python验证码识别实例代码
Feb 03 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
Python处理中文标点符号大集合
May 14 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
Python Subprocess模块原理及实例
Aug 26 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
Python实现汇率转换操作
May 03 Python
python如何写try语句
Jul 14 Python
Selenium 配置启动项参数的方法
Dec 04 Python
Python标准库pathlib操作目录和文件
Nov 20 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
德劲1104的电路分析与改良
2021/03/01 无线电
第一节--面向对象编程
2006/11/16 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
php批量删除操作(数据访问)
2017/05/23 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
详解vue 命名视图
2019/08/14 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
python实现机器学习之多元线性回归
2018/09/06 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
python Tkinter的图片刷新实例
2019/06/14 Python
python基于event实现线程间通信控制
2020/01/13 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
软件项目实施计划书
2014/05/02 职场文书
安全生产目标管理责任书
2014/07/25 职场文书
优秀党员申报材料
2014/12/18 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
使用Python开发冰球小游戏
2022/04/30 Python
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技