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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
python如何实现一个刷网页小程序
Nov 27 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python3使用matplotlib绘制散点图
Mar 19 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
kafka-python 获取topic lag值方式
Dec 23 Python
Python如何读取文件中图片格式
Jan 13 Python
Python netmiko模块的使用
Feb 14 Python
Python基于pandas爬取网页表格数据
May 11 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
python基于tkinter制作下班倒计时工具
Apr 28 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多态的实现详解
2013/06/09 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
php实现可运算的验证码
2015/11/10 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
es6基础学习之解构赋值
2018/12/10 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
vue实现简单图片上传
2020/06/30 Javascript
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
详解python的变量缓存机制
2021/01/24 Python
表达自我的市场:Society6
2018/08/01 全球购物
软件工程师岗位职责
2013/11/16 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
大连导游词
2015/02/12 职场文书
八月迷情观后感
2015/06/11 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android