java 演算法基礎之一尋找最大公約數

2021-09-01 19:34:40 字數 1212 閱讀 1595

最近發現在搞android的都要懂一點資料結構和演算法才能高階到高手,所以就回去複習了一下基礎,為一些公司招聘做題做準備。

今天研究了一下最大公約數的求法,在網上也找了不同的解法,現在就想總結一下,拿出來分享給大家,共同 學習

首先講乙個什麼是公約數,這個問題我們小學都學過,可能有一部分人已經忘記了,所以還是講一下,假設有兩個數a,b,所謂的公約數就是能把a,b整除的最大整數。

明白了要求我們就來解決問題,一拿到問題我們都應該都能想到乙個方法,就是使用窮舉法,從2開始乙個個找,到乙個兩個都能除的就記錄起來,一直找到小於min(a,b)結束,

記錄到的值就是他們的最大公約數**由下:

//找出最大公約數,窮舉法

public static int getmaxdivide_ab(int a,int b)

if(a>b)else

for(int i=2;i=b>0,

歐幾里德就給了我們乙個很好的定理,f(a,b)=f(b,a%b),有了這個等式我們就很容易得出這個演算法的遞迴式,現在我們來看下這個等式是怎麼來的

設有 r=a/b ,q=a%b

所以就有 a=a/b*b+q ----(這裡的a/b*b!=a ,原因就是我們用的是整數來計算的)

也就是a=r*b+q 變換一下有:q=a-r*b 設d=f(a,b),a/d=m,b/d=n;則 有q=dm-r*dn=d(m-rn)

所以q/d也為0;設d|q表示d是q的約數;以下相同;

又有d|b;所以有d|(b,q),設d是(b,q)的最大公約數,則會有d<=d=f(b,q);

再回到前面r=a/b,q=a%b這兩個條件有

a=r*b+q,由於d|(b,q),所以d|a,所以有d|(a,b)

所以有d<=d=f(a,b),結合上部分就有d<=d <+d,及d=d;

所以得證;

**實現由下:

[code]

public static int oujilide(int a,int b)

if(0==b)

if(istwo(a))

return movecombe(a/2, b);

}else

return movecombe(b, a-b);}}

private static boolean istwo(int a) else

}上面的**都比較簡單,我就沒有做註解了,這些思想大部分都來自了網路,**自己重寫過,有不對之處還請大家指出,共同學習。

Java基礎之一

public private protected 預設修飾符 在說明這四個關鍵字之前,我想就class之間的關係做乙個簡單的定義,對於繼承自己的class,base class可以認為他們都是自己的子女,而對於和自己乙個目錄下的classes,認為都是自己的朋友。1 public public表明該...

最大流演算法之一 EK演算法

ek演算法的流程很簡單 隨意找乙個可行流作為流量網路更新的基礎 一般題目沒有規定可以採用流量為0的可行流 利用bfsb fs找一條從源點到匯點的可行流路徑 用新找到的可行流路徑更新原有流量網路 先找到該可行流路徑中流量最小邊,然後將該路徑上所有正向邊都減去該最小邊的流量,反向邊都加上該最小邊的流量 ...

Java基礎之一維陣列

1 陣列 掌握 1 概述 儲存同一種資料型別的多個元素的容器。同一資料型別 多個元素容器 2 定義格式 a 資料型別 陣列名 例如 int arr1 b 資料型別 陣列名 了解 3 陣列的初始化 a 動態初始化 只給長度,系統給出預設值 格式 資料型別 陣列名 new 資料型別 陣列長度 舉例 in...