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中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
python验证码识别的示例代码
Sep 21 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
儿童编程python入门
May 08 Python
python爬虫之urllib库常用方法用法总结大全
Nov 14 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
Python使用pyenv实现多环境管理
Feb 05 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
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脚本的10个技巧(7)
2006/10/09 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
PHPMailer发送邮件
2016/12/28 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
Python中文件的读取和写入操作
2018/04/27 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
世界排名第一的运动鞋市场:Flight Club
2020/01/03 全球购物
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
2014年维修工作总结
2014/11/22 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL