本人菜鳥一枚,突然之間,偶得上帝靈光閃現,突然感覺自己日子過的太輕鬆,然後,自殺式的買了一本演算法書,從今天開始了地獄般的生活;
演算法第一章講的是,歐幾里得演算法求其目的就是找到兩個數的最大公約數,然後,我馬上關上書,喝了一杯茶,腦海中回想著,這都是啥??對於一個數學從來都沒有及格的我來說,想放棄
吐槽完畢,說正題,何為最大公約數,直接百度,谷歌,360,通過一系列的查詢,來個官方版的
這。。。。是啥?沒看懂
其實,最大公約數,即為能夠同時被兩個整數除的最大的數,還不懂?上圖
如果還不懂,請關閉本頁面,然後,開啟百度,找個視訊看一下吧!我無能為力了。
歐幾里得演算法:又稱輾轉相除法,用於計算兩個正整數,a,b的最大公約數,計算原理依賴於下面的定理
定理:gcd(a,b) = gcd(b,a mod b)(a>b且a mod b不為0)
有人會問,mod是啥?這個是求餘啊! MOD是求餘運算子,例如a mod b=c,表明a除以b餘數為c
證明:a 可以表示成a = kb +r 則 r=a mod b
假設 d是a,b的一個公約數,則有 d|a ,d|b 而,r=a-kb 因此d|r
因此d也是(b,a mod b)的公約數
因此(a,b)和(b,a mod b)的公約數是一樣的,最大的公約數也必然相等
看懂沒?我也沒咋看懂
分析一下吧,
假設x>y x和y的最大公約數用 f(x,y)表示
假設 x/y = a
x%y = b
所以 ay+b = x
因為a為x除以的整數部分,b為x除以y的餘數部分,所以 ay+b = x
將上面的調換一下 b= x-a*y
因為x和y都能被f(x,y)整數 所以f(x,y)是x和y的最大公約數
所以b也同樣能被f(x,y)整除 即x和y的最大公約數f(x,y)它是b的約數,所以求x和y的最大公約數也就相當於求y和b的最大公約數(因為,這裡x>y 而且 x%y肯定小於y,所以,這樣一來,我們的範圍縮小了)
所以 歐幾里得公式也就這麼來了
f(x,y) = f(y,x%y)
所以,這個演算法就是不停的迭代,直到找出x%y=0的時候,停止迭代,那個時候,最大的公約數就是y了
下面為,書中的一個求最大公約數的案例
/**
* 演算法分析:
* 計算兩個非負數p和q的最大公約數,若q是0,則最大的公約數是p,否則,p除q,得到餘數r,p和q最
* 大公約數即為q和r的最大公約數
* Created by huxd on 2017/9/14.
*/
//歐幾里得演算法
public static int gcd(int p ,int q){
if(q == 0) return p;
int r = p%q;
return gcd(q,r);
}複製程式碼
實際程式碼
package Test1;
import java.util.*;
public class Tset1 {
public static void (String[] args) {
Scanner scan = new Scanner(System.in);// 接收控制檯輸入的資訊
System.out.print("請輸入第一個整數:");
int x = scan.nextInt(); // 取出控制檯輸入的資訊
System.out.print("請輸入第二個整數:");
int y = scan.nextInt(); // 取出控制檯輸入的資訊
System.out.println(gcd(x, y));// 呼叫maxCommonDivisor()方法
}
public static int gcd(int x, int y) {
// 防止輸入為0
if (x == 0 || y == 0) {
return 0;
}
//新增一個保證 x>y
if (x < y) {
int temp = x;
temp = y;
y = x;
}
//演算法實現
if (x % y == 0) {
return y;
} else {
return gcd(y, x % y);
}
}
}複製程式碼
學習路上長路慢慢,努力前行!
部落格地址:www.huxd.org