python如何求解两数的最大公约数


Posted in Python onSeptember 27, 2018

题目:

给定两个自然数,求这两个数的最大公约数。

分析:

单看题目的话,非常简单,我们可以循环遍历自然数,如果能够整除两个自然数,就把这个数记下来,在这些记录中找到最大的一个。
但是这样做有几个缺点:一是做除法计算量比较大,二是遍历所有自然数完全没有必要。另外,如果能够循环,还是不要递归,因为Python的函数递归最大栈空间是1000(如果我没有记错的话),如果数字大一些,很容易出现爆栈。

所以在这里有两种处理方法:

1、如果较大的自然数除较小的一个自然数,取得余数,较小的自然数和余数的最大公约数就是我们要求的值。
2、如果较大的自然数减去较小的自然数,取得差值,较小的自然数和差值的最大公约数就是我们要求的值。

基于以上两条,我们就可以在根据定义得到的算法的基础上进行改进,但是!减法操作当然比取余要方便很多。而且在计算机里,做位运算的速度要比加减乘除都快,所以,我写了四个算法,具体描述在代码的 __doc__里有注释阐述

代码:

def greatest_common_divisor_1(self, num1, num2):
    '''
    数值计算寻找最大公约数,给定两个整数,计算其最大公约数,时间复杂度为 o(min(num1,num2)),取余运算复杂度高
    '''
    gbc = 1
    for i in xrange(2, min(num1, num2)+1):
      if num2 % i == 0 and num1 % i == 0:
        gbc = i
    return gbc

  def greatest_common_divisor_2(self, num1, num2):
    '''
    辗转相减法,时间复杂度最差为 o(min(num1,num2)),一般情况下都比这个要好。相减运算要比除法方便很多
    '''
    while num1 != num2:
      if num1 > num2:
        num1 = num1 - num2
      else:
        num2 = num2 - num1
    return num1

  def greatest_common_divisor_3(self, num1, num2):
    '''
    求余数法,取模运算比较麻烦,时间复杂度低 o(log max(num1, num2))
    '''
    while num1 != num2:
      if num1 > num2:
        if num1 % num2 == 0:
          return num2
        num1 = num1 % num2
      else:
        if num2 % num1 == 0:
          return num1
        num2 = num2 % num1
    return num1

  def greatest_common_divisor(self, num1, num2):
    '''
    求两个数的最大公约数
    综合取余法和辗转相减法,既能得到较好的时间复杂度,又能避免取余运算,时间复杂度稳定 o(log max(num1,num2))
    如果取两个非常大的数的话,前面的方法很容易爆栈、取余困难等等,但是该方法没有问题
    a = 999999342353200
    b = 777774234
    print greatest_common_divisor(a, b)
    '''
    factor = 1
    if num1 < num2:
      return greatest_common_divisor_1(num2, num1)
    while num1 != num2:
      if num1 & 1 is False and num2 & 1 is False: # 均为偶数
        num1 = num1 >> 1
        num2 = num2 >> 2
        factor *= 2
      elif num1 & 1 is False and num2 & 1 is True:
        num1 = num1 >> 1
      elif num1 & 1 is True and num2 & 1 is False:
        num2 = num2 >> 1
      else:
        if num1 > num2:
          num1 = num1 - num2
        else:
          num2 = num2 - num1
    return factor*num1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解在Python程序中解析并修改XML内容的方法
Nov 16 Python
python装饰器与递归算法详解
Feb 18 Python
Python输入二维数组方法
Apr 13 Python
简单了解python反射机制的一些知识
Jul 13 Python
Python 单例设计模式用法实例分析
Sep 23 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
Python操作注册表详细步骤介绍
Feb 05 Python
python中文分词库jieba使用方法详解
Feb 11 Python
python字符串的index和find的区别详解
Jun 20 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
Pytest中conftest.py的用法
Jun 27 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 #Python
python斐波那契数列的计算方法
Sep 27 #Python
python实现汉诺塔算法
Mar 01 #Python
Python3中bytes类型转换为str类型
Sep 27 #Python
python求解数组中两个字符串的最小距离
Sep 27 #Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 #Python
详解django中使用定时任务的方法
Sep 27 #Python
You might like
如何利用php+mysql保存和输出文件
2006/10/09 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
setInterval 和 setTimeout会产生内存溢出
2008/02/15 Javascript
JS option location 页面跳转实现代码
2008/12/27 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
前端面试知识点锦集(JavaScript篇)
2016/12/28 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
深入Python解释器理解Python中的字节码
2015/04/01 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
python中requests库session对象的妙用详解
2017/10/30 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
pandas 将索引值相加的方法
2018/11/15 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
合作协议书
2014/04/23 职场文书
五五普法心得体会
2014/09/04 职场文书
2014年仓库工作总结
2014/11/20 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书