引言
我是一個1年android開發程序員,工作中遇到的問題不會就百度,再不會就問人,github上開源項目沒得,okhttp這樣流行的框架也不了解,算法也不會,寫的代碼自己都不想看。想想自己的確沒得什么競爭力,所以決定今年主打倆本書,一本是java數據結構與算法你另外一本是代碼的重構。阿里工程師說過一句話:"工程師對于代碼,一定要“精益求精”,不論從性能,還是簡潔優雅,都要具備“精益求精”的工匠精神,認真打"。這句話深深的對住了我的胃口。對 程序員就要這樣。能寫出一段高效,簡潔,易懂的代碼 真的不是容易事。廢話不多說了,開始我的算法系列的博客,算是自己給自己的付出記錄了一筆。為以后進軍大公司做準備。
正題
歐幾里得算法定理:兩個整數的最大公約數等于其中較小的那個數和兩數相除余數的最大公約數。最大公約數(greatest common divisor)縮寫為gcd。
gcd(a,b) = gcd(b,a mod b) (不妨設a>b 且r=a mod b ,r不為0)。其中gcd(a,b)表示求a,b間的最大公約數。因此我們只要證明:
gcd(a,b) = gcd(b,a mod b) 那么這個定理就成立.(a>b且b>(a mod b))
證明過程如下:
設 a=kb+r。那么 r=a%b;r=a-kb。假設d 是a,b公約數。那么d|a,d|b。那么可以知道(a-kb)/d 也是能夠除斷的。即d|(a-kb)。即d|r。gcd(a,b)公約數為為d。那么d是不是gcd(b,a mod b)的公約數。很顯然d也是gcd(b,a mod b)的公約數。說明gcd(a,b)=gcd(b,a mod b)成立。
代碼實現:
/**
* Created by wxy on 2017/5/14.
* 歐幾里得算法
* 求倆個數的最大公約數
*/
public class FindGcd {
public long gcd(long n, long n1) {
while (n1 != 0) {
long rem = n % n1;
System.out.println(rem);
n = n1;
n1 = rem;
}
return n;
}
public static void main(String args[]){
FindGcd findGcd=new FindGcd();
findGcd.gcd(1989,1590);
//System.out.println(findGcd.gcd(50,15));
}
}
時間復雜度:n = O(log(N))
看吧算法的誘惑,假如不知道求最大公約數的算法,靠自己手寫代碼去解決,想想麻煩還不說,代碼執行效率也不高。真正意義上體會到算法的魅力。也體會到數學對編程的幫助。(證明歐幾里得算法,看了好幾篇文章才懂)。出社會到現在高數老底都被啃光了。以后一邊學習算法 一邊惡補一下高數,