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动态监控日志内容的示例
Feb 16 Python
ptyhon实现sitemap生成示例
Mar 30 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
在python 中实现运行多条shell命令
Jan 07 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python3和pyqt5实现控件数据动态显示方式
Dec 13 Python
关于Django Models CharField 参数说明
Mar 31 Python
Python的历史与优缺点整理
May 26 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
PHP7内核之Reference详解
2019/03/14 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
小程序页面动态配置实现方法
2019/02/05 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
Python实现简单查找最长子串功能示例
2019/02/26 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
python语言中有算法吗
2020/06/16 Python
婚庆公司的创业计划书
2014/01/22 职场文书
校园环保建议书
2014/05/14 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
营销与策划实训报告
2014/11/05 职场文书
结婚仪式主持词
2015/06/29 职场文书
全民创业工作总结
2015/08/13 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
预防职务犯罪警示教育心得体会
2016/01/15 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
html5调用摄像头实例代码
2021/06/28 HTML / CSS
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang