欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python如何求解兩數(shù)的最大公約數(shù)

 更新時間:2018年09月27日 09:46:11   作者:冬日新雨  
這篇文章主要為大家詳細(xì)介紹了python如何求解兩數(shù)的最大公約數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下

題目:

給定兩個自然數(shù),求這兩個數(shù)的最大公約數(shù)。

分析:

單看題目的話,非常簡單,我們可以循環(huán)遍歷自然數(shù),如果能夠整除兩個自然數(shù),就把這個數(shù)記下來,在這些記錄中找到最大的一個。
但是這樣做有幾個缺點:一是做除法計算量比較大,二是遍歷所有自然數(shù)完全沒有必要。另外,如果能夠循環(huán),還是不要遞歸,因為Python的函數(shù)遞歸最大棧空間是1000(如果我沒有記錯的話),如果數(shù)字大一些,很容易出現(xiàn)爆棧。

所以在這里有兩種處理方法:

1、如果較大的自然數(shù)除較小的一個自然數(shù),取得余數(shù),較小的自然數(shù)和余數(shù)的最大公約數(shù)就是我們要求的值。
2、如果較大的自然數(shù)減去較小的自然數(shù),取得差值,較小的自然數(shù)和差值的最大公約數(shù)就是我們要求的值。

基于以上兩條,我們就可以在根據(jù)定義得到的算法的基礎(chǔ)上進(jìn)行改進(jìn),但是!減法操作當(dāng)然比取余要方便很多。而且在計算機里,做位運算的速度要比加減乘除都快,所以,我寫了四個算法,具體描述在代碼的 __doc__里有注釋闡述

代碼:

def greatest_common_divisor_1(self, num1, num2):
    '''
    數(shù)值計算尋找最大公約數(shù),給定兩個整數(shù),計算其最大公約數(shù),時間復(fù)雜度為 o(min(num1,num2)),取余運算復(fù)雜度高
    '''
    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):
    '''
    輾轉(zhuǎn)相減法,時間復(fù)雜度最差為 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):
    '''
    求余數(shù)法,取模運算比較麻煩,時間復(fù)雜度低 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):
    '''
    求兩個數(shù)的最大公約數(shù)
    綜合取余法和輾轉(zhuǎn)相減法,既能得到較好的時間復(fù)雜度,又能避免取余運算,時間復(fù)雜度穩(wěn)定 o(log max(num1,num2))
    如果取兩個非常大的數(shù)的話,前面的方法很容易爆棧、取余困難等等,但是該方法沒有問題
    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: # 均為偶數(shù)
        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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python 中的結(jié)構(gòu)模式匹配及重要性

    Python 中的結(jié)構(gòu)模式匹配及重要性

    這篇文章主要介紹了Python 中的結(jié)構(gòu)模式匹配,本篇文章介紹結(jié)構(gòu)模式匹配及其在 Python 中的重要性,它還使用不同的模式來演示如何使用 match … case 語句,需要的朋友可以參考下
    2023-06-06
  • Python多線程與異步處理在HTTP請求中的應(yīng)用方式

    Python多線程與異步處理在HTTP請求中的應(yīng)用方式

    這篇文章主要介紹了Python多線程與異步處理在HTTP請求中的應(yīng)用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python的pytest測試框架使用詳解

    Python的pytest測試框架使用詳解

    這篇文章主要介紹了Python的pytest測試框架使用詳解,說到?pytest,大家總不免要拿來和?unittest?來比一下,但是?unittest?畢竟是標(biāo)準(zhǔn)庫,兼容性方面肯定沒得說,但要論簡潔和方便的話,pytest?也是不落下風(fēng)的,需要的朋友可以參考下
    2023-07-07
  • 如何用Python獲取計算機名,ip地址,mac地址

    如何用Python獲取計算機名,ip地址,mac地址

    這篇文章主要介紹了如何用Python獲取計算機名,ip地址,mac地址,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • 在Python3中初學(xué)者應(yīng)會的一些基本的提升效率的小技巧

    在Python3中初學(xué)者應(yīng)會的一些基本的提升效率的小技巧

    這篇文章主要介紹了在Python3中的一些基本的小技巧,有利于剛剛上手Python的初學(xué)者提升開發(fā)效率,需要的朋友可以參考下
    2015-03-03
  • 利用Python的Twisted框架實現(xiàn)webshell密碼掃描器的教程

    利用Python的Twisted框架實現(xiàn)webshell密碼掃描器的教程

    這篇文章主要介紹了利用Python的Twisted框架實現(xiàn)webshell密碼掃描器的教程,用到了Twisted框架的異步通信機制,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于Python中的 oct 函數(shù)與 min 函數(shù)

    關(guān)于Python中的 oct 函數(shù)與 min 函數(shù)

    本文主要介紹了Python oct 函數(shù)與 min 函數(shù);oct 函數(shù)是 Python 內(nèi)置函數(shù),主要將一個整數(shù)轉(zhuǎn)為八進(jìn)制,與 ord 函數(shù) / chr 函數(shù) 有點類似;min 函數(shù)返回給定參數(shù)的最小值,參數(shù)可以為序列語法,感興趣的小伙伴請繼續(xù)閱讀下文
    2021-09-09
  • selenium+python環(huán)境配置教程詳解

    selenium+python環(huán)境配置教程詳解

    這篇文章主要介紹了selenium+python環(huán)境配置教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Python中順序表原理與實現(xiàn)方法詳解

    Python中順序表原理與實現(xiàn)方法詳解

    這篇文章主要介紹了Python中順序表原理與實現(xiàn)方法,結(jié)合實例形式分析了Python順序表的概念、原理及增刪查等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • Python使用Pycharm必備插件推薦(非常好用!)

    Python使用Pycharm必備插件推薦(非常好用!)

    首先我們要知道pycharm是一款非常強大的python集成開發(fā)環(huán)境,帶有一整套python開發(fā)工具,這篇文章主要給大家介紹了關(guān)于Python使用Pycharm必備插件推薦的相關(guān)資料,需要的朋友可以參考下
    2023-11-11

最新評論