演算法(第4版) 學習筆記一——求最大公約數
演算法是解決某種問題的方法,這種方法與程式語言無關。
要定義一個演算法,首先可以用自然語言將它描述出來,再將它轉成程式語言。
求最大公約數問題的自然語言演算法描述:
計算兩個非負整數p和q的最大公約數:若q是0,則最大公約數為p。否則,將p除以q得到餘數r,p和q的最大公約數即為q和r的最大公約數。
證明:
假設p比q大,那麼
p = kq + r
………………(1)
k為p除以q得到的商,r為餘數,這裡的r不為0
假設p和q的其中一個公約數為x,那麼
p = mx
………………(2)
q = nx
………………(3)
將(2)和(3)代入(1),可得到
mx = knx + r
兩邊同除以x,得到
m = kn + r/x
………………(5) 因為m、k和n都是正整數,所以r/x也是正整數。
換句話說,p和q的任意一個公約數都可以整除r,所以p、q、r的所有公約數相等,那麼最大公約數也相等,那麼求p和q的最大公約數就可以轉化為求q和r的最大公約數。
java語言描述
//此方法預設p>q
public static int gcd(int p, int q) {
if(q==0) return p;
int r = p % q;
return gcd(q, r);
}