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实现的二维码生成小软件
Jul 11 Python
python实现连接mongodb的方法
May 08 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
django foreignkey(外键)的实现
Jul 29 Python
Python queue队列原理与应用案例分析
Sep 27 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
Python利用命名空间解析XML文档
Aug 10 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
python3跳出一个循环的实例操作
Aug 18 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 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使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
PHP attributes()函数讲解
2019/02/03 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
python实现四人制扑克牌游戏
2020/04/22 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
python lambda的使用详解
2021/02/26 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
优秀研究生自我鉴定
2013/12/04 职场文书
五一服装活动方案
2014/01/11 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
家长对孩子的评语
2014/04/18 职场文书
企业公益活动策划方案
2014/08/24 职场文书
元旦标语大全
2014/10/09 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
MySQL 原理与优化之Update 优化
2022/08/14 MySQL