Python基于更相减损术实现求解最大公约数的方法

作者:grey_csdn 时间:2022-10-31 16:13:24 

本文实例讲述了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.jb51.net/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.jb51.net/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.jb51.net/jisuanqi/jsq

希望本文所述对大家Python程序设计有所帮助。

来源:https://blog.csdn.net/grey_csdn/article/details/77416172

标签:Python,最大公约数
0
投稿

猜你喜欢

  • numpy.std() 计算矩阵标准差的方法

    2023-06-04 19:50:34
  • Python autoescape标签用法解析

    2023-03-14 06:36:22
  • django filters实现数据过滤的示例代码

    2023-11-20 03:59:22
  • Python基于Matplotlib库简单绘制折线图的方法示例

    2021-10-26 15:01:12
  • Pycharm无法显示动态图片的解决方法

    2023-01-29 23:13:42
  • 解决mysql连接超时和mysql连接错误的问题

    2024-01-14 22:16:36
  • pd.to_datetime中时间object转换datetime实例

    2021-09-23 19:22:15
  • Go语言程序开发gRPC服务

    2024-04-23 09:38:02
  • javascript仿qq界面的折叠菜单实现代码

    2024-06-12 17:12:49
  • 使用PHP获取网络文件的实现代码

    2023-09-09 08:41:53
  • python 利用pandas将arff文件转csv文件的方法

    2021-05-31 05:49:34
  • Python OpenCV图像指定区域裁剪的实现

    2021-12-30 01:41:35
  • Sql Server中的视图介绍

    2024-01-14 14:31:22
  • 微信小程序开发之animation循环动画实现的让云朵飘效果

    2024-04-16 09:00:11
  • js调用flash代码

    2010-01-23 12:35:00
  • pytest配置文件pytest.ini的详细使用

    2021-10-25 07:48:04
  • 2014 年最热门的21款JavaScript框架推荐

    2024-04-16 08:48:08
  • Python中的lambda和apply用法及说明

    2023-08-12 14:56:46
  • Python 图像处理 Pillow 库详情

    2022-12-05 04:46:12
  • Python 列表排序方法reverse、sort、sorted详解

    2021-10-18 10:11:52
  • asp之家 网络编程 m.aspxhome.com