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调用java的Webservice示例
Mar 10 Python
从Python程序中访问Java类的简单示例
Apr 20 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
python执行使用shell命令方法分享
Nov 08 Python
Python 通过调用接口获取公交信息的实例
Dec 17 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
Feb 05 Python
Python中包的用法及安装
Feb 11 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
Python爬虫之Selenium下拉框处理的实现
Dec 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
php 用sock技术发送邮件的函数
2007/07/21 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
HTML的select控件美化
2017/03/27 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
python实现代理服务功能实例
2013/11/15 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
业务部主管岗位职责
2014/01/29 职场文书
校园活动策划方案
2014/06/13 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
呐喊读书笔记
2015/06/30 职场文书
领导视察通讯稿
2015/07/18 职场文书