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 requests库中的代理实例讲解
May 07 Python
numpy返回array中元素的index方法
Jun 27 Python
破解安装Pycharm的方法
Oct 19 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
Python装饰器如何实现修复过程解析
Sep 05 Python
python切片作为占位符使用实例讲解
Feb 17 Python
如何理解及使用Python闭包
Jun 01 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
如何为你的JS项目添加智能提示与类型检查详解
2019/03/12 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
python不带重复的全排列代码
2013/08/13 Python
python学习手册中的python多态示例代码
2014/01/21 Python
python输出指定月份日历的方法
2015/04/23 Python
python实现统计代码行数的方法
2015/05/22 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
python实现简单日期工具类
2019/04/24 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python自动化操作实现图例绘制
2020/07/09 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
播音主持女孩的自我评价分享
2013/11/20 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
初中学校军训方案
2014/05/09 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
先进班组材料范文
2014/12/25 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python