成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從高中碾轉相除法、更相減損術算法談起

開發 前端 算法
編程的本質來源于算法,而算法的本質來源于數學,編程只不過將數學題進行代碼化?!?--- Runsen」

[[356850]]

編程的本質來源于算法,而算法的本質來源于數學,編程只不過將數學題進行代碼化?!?--- Runsen」

先問你們一個小學問題:「如何求兩個整數的最大公約數?」

曾經見過不少的算法題,發現有的并不在數據結構和算法大綱中,而是來源于高中數學。

高中數學在必修三中,有一個非常重要的知識點,叫做「碾轉相除法、更相減損術」。

輾轉相除法, 又名歐幾里德算法(Euclidean algorithm)乃求兩個正整數之最大公因子的算法。它是已知最古老的算法, 其可追溯至公元前300年前。

在古代,有一個比較出名的數學家,叫做「劉徽」。而更相減損術是我國數學家劉徽的專著《九章算術》中記載的.

碾轉相除法

輾轉相除是求最大公約數的一種算法。給兩個數,我們可以把它組成數對(a,b)輾轉相除法基于如下原理:「兩個整數的最大公約數等于其中較小的數和兩數的相除余數的最大公約數?!?/p>

求a和b的最大公約數,就用ab中較小的數去除另一個數,這個時候會有一個余數,當余數是0的時候,那個較小的數就是最大公約數。

若余數不是0,那么我們用這個余數來替換那個比較大的數,然后以此類推,直到算出最大公約數。

比如,下面我用碾轉相除法求100和24的最大公約數,很明顯最大公約數就是25。

  1. 100 = 24 * 4  + 4 
  2. 24  =  4 * 6  + 0  

很顯然4和6中,那個較小的數4就是100和24最大公約數。

下面用碾轉相除法求55和120的最大公約數,很明顯最大公約數就是5。

  1. 55 = 120 * 0  + 55 
  2. 120  =  55 * 2  + 10 
  3. 55 = 10 * 5 + 5 

很顯然10和5中,那個較小的數5就是55和120最大公約數。

算法的流程圖(摘自百度百科)

因此得到設兩數為m,n,這里不需要判斷兩數中誰最大。

求m,n兩數的最大公約數的步驟為:

用m除以n,m%n=r(r>=0)。如果r=0,則min(m,n)。

如果r≠0,用n除以r,依此循環,直到r=0結束

下面,我們將使用對碾轉相除法進行代碼化。

  1. def gcd(a, b): 
  2.     # 如果b是0,退出循環 
  3.     while b: 
  4.         # 循環賦值 
  5.         a, b = b, a%b 
  6.     return a 
  7. print(gcd(100,25)) #25 

輾轉相除法本質上是一種遞歸的代碼,把求兩個大數的公約數gcd(a,b)轉化為 求其中較小的數和兩數的相除余數的最大公約數gcd(b,a%b),直至b為0,則返回a為求得的最大公約數gcd(gcd(a,b), 0)。

因此可以得到:gcd(a,b) = gcd(b,a%b) = gcd(gcd(a,b), 0)

  1. def gcd(a, b):  
  2.     return gcd(b, a % b) if b != 0 else a 
  3.      
  4. print(gcd(55,120)) #5 

下面對Python代碼進行Java的代碼轉化

  1. /** 
  2.  * @author Runsen 
  3.  * @date 2020/12/9 13:18 
  4.  */ 
  5. public class Gcd { 
  6.     public static void main(String[] args) { 
  7.         int gcd = gcd(91, 49); 
  8.         System.out.println(gcd); 
  9.     } 
  10.  
  11.     private static int gcd(int a, int b) { 
  12.         while(b != 0) { 
  13.             int temp = a % b; 
  14.             a = b; 
  15.             b = temp
  16.         } 
  17.         return a; 
  18.     } 

下面對Python代碼進行JavaScript的代碼轉化。

  1. function gcd(a, b){ 
  2.     while(b != 0){ 
  3.        temp = a % b; 
  4.        a = b; 
  5.        b = temp
  6.     }; 
  7.     return a; 
  8.       
  9. console.log((gcd(55,120))) #5 

更相減損術

我國早期也有求最大公約數問題的算法,就是更相減損術。

在《九章算術》中有更相減損術求最大公約數的步驟:可半者半之,不可半者,副置分母子之數,以少減多,更相減損,求其等也,以等數約之。

更相減損術來源于數的整除性質:即如果兩個整數a、b都能被c整除,那么a與b的差也能被C整除。

比如求98和63的最大公約數。

先看98和63這兩個數,因為63不是偶數,所以用大數減去小數,得到98-63=35 , 63-35=28 35-28=7 , 28-7=21 , 21-7=14 , 14-7=7 。

「此時,減數和差相等7」,所以98和63的最大公約數是7。

再比如求260和104的最大公約數。

先看260和104兩個數,這兩個數都是偶數,所以用2約簡得130和52。

約簡之后的130和52也都是偶數,繼續用2約簡得65和26,此時65不是偶數,所以用大數減去小數 65-26=39 , 39-26=13 , 26-13=13。

此時,減數和差相等,再上面約去2個2, 得到的數是13,所以260和104的最大公約數是2×2×13=52。

因此更相減損術不在如下:

  • 如果兩個整數都是偶數,就使用2約簡,直到兩個整數不再都是偶數,然后執行第2步。如果兩個整數不都是偶數,則直接執行第2步。
  • 用較大的數減去較小的數,如果得到的差恰好等于較小的數,則停止。否則,對較小的數和差值重復這個過程。
  • 第1步中約掉的若干個2和第2步中得到的差的乘積為原來兩個整數的最大公約數。

下面,我們將使用對更相減損術進行代碼化。

  1. ''
  2. @Author:Runsen 
  3. @WeChat:RunsenLiu  
  4. @微信公眾號:Python之王 
  5. @CSDN:https://blog.csdn.net/weixin_44510615 
  6. @Github:https://github.com/MaoliRUNsen 
  7. @Date:2020/12/9 
  8. ''
  9. def MaxCommDivisor(m, n): 
  10.     # 如果兩個整數都是偶數,就使用2約簡,需要記錄約簡次數 
  11.     index = 1 
  12.     while m % 2 == 0 and n % 2 == 0: 
  13.         m = m / 2 
  14.         n = n / 2 
  15.         index = index * 2 
  16.     # 用較大的數減去較小的數,因此需要判斷m和n的大小,確保m是最大的。 
  17.     if m < n: 
  18.         m, n = n, m 
  19.     # 用較大的數減去較小的數,如果得到的差恰好等于較小的數,則停止。否則,對較小的數和差值重復這個過程。 
  20.     while m - n != n: 
  21.         diff = m - n 
  22.         if diff > n: 
  23.             m = diff 
  24.         else
  25.             m = n 
  26.             n = diff 
  27.     return n * index 
  28.  
  29. print(MaxCommDivisor(24, 12)) #12 

更相減損術和輾轉相除法在一千多年前的東方和西方同時被提出,這說明天才的想法總是驚人的相似,人類科技文明的進程也是同步的,這就是算法之美。

本文已收錄 GitHub: https://github.com/MaoliRUNsen/runsenlearnpy100

 

責任編輯:姜華 來源: Python之王
相關推薦

2013-07-11 13:26:11

2017-04-25 16:45:11

2015-09-01 10:21:53

排序算法總結

2021-09-02 15:25:54

技術視頻摳圖

2022-10-13 08:32:44

手機故障IO

2022-11-02 08:36:35

ArgoAIOPS

2024-12-10 09:07:17

2011-07-28 10:32:06

廣聯達

2023-04-25 17:20:22

數據模型

2025-03-11 00:35:00

DeepSeektoC業務

2018-06-04 22:27:47

2015-08-05 15:53:35

power星環

2018-07-06 11:39:40

2022-03-10 15:21:26

算法人工智能憲法

2018-01-22 08:20:52

教育部人工智能信息技術

2009-05-19 09:55:11

IDC

2017-03-28 13:21:50

互聯網

2017-07-03 13:53:17

大數據大數據平臺數據治理

2020-06-07 15:50:32

編程學習技術

2011-05-18 11:02:55

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人免费视频 | 国产一区久久精品 | 亚洲一区二区av | 免费成人高清 | 中文字幕第7页 | 亚洲伊人久久综合 | 国产专区视频 | 日韩欧美国产一区二区 | 草久久久 | 福利一区二区 | 欧美久久一区二区 | 欧美一区视频 | 精品国产乱码久久久久久蜜退臀 | 在线观看国产网站 | 日本视频中文字幕 | 91久久国产精品 | 久久精品欧美一区二区三区不卡 | 午夜小电影 | 噜久寡妇噜噜久久寡妇 | 欧美一级艳情片免费观看 | 日本成人免费网站 | 欧美一级片在线 | 在线免费观看黄色 | 黄色大片在线 | 国产一二三区免费视频 | 国产精品一二区 | 亚洲一区二区在线视频 | 亚洲网址 | 午夜精品久久久久久久99黑人 | 91在线网站 | 亚洲精精品 | 国产色网站 | 国产精品国产a级 | 日韩视频中文字幕 | 国产免费一区二区 | 一区二区三区视频在线免费观看 | 久久久久免费 | 欧美精品一区在线发布 | 在线视频一区二区三区 | 一区二区三区在线免费观看 | 国产精品久久久久久久久免费樱桃 |