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多线程用法实例详解
Jan 15 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
python pandas模块基础学习详解
Jul 03 Python
postman模拟访问具有Session的post请求方法
Jul 15 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
python解析多层json操作示例
Dec 30 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
python中pandas.read_csv()函数的深入讲解
Mar 29 Python
Django利用AJAX技术实现博文实时搜索
May 06 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
2013/08/05 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
JS+CSS实现的简单折叠展开多级菜单效果
2015/09/12 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
Python语言的12个基础知识点小结
2014/07/10 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
Python中关于浮点数的冷知识
2019/09/22 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
竞选班长的演讲稿
2014/04/24 职场文书
德育标兵事迹材料
2014/08/24 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
服务行业标语口号
2015/12/26 职场文书
标准发言稿结尾
2019/07/18 职场文书
分享python函数常见关键字
2022/04/26 Python