最近發現在搞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...