java演算法 求最大公約數

huxd發表於2017-10-11

本人菜鳥一枚,突然之間,偶得上帝靈光閃現,突然感覺自己日子過的太輕鬆,然後,自殺式的買了一本演算法書,從今天開始了地獄般的生活;
演算法第一章講的是,歐幾里得演算法求其目的就是找到兩個數的最大公約數,然後,我馬上關上書,喝了一杯茶,腦海中回想著,這都是啥??對於一個數學從來都沒有及格的我來說,想放棄
吐槽完畢,說正題,何為最大公約數,直接百度,谷歌,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的餘數部分,所以 a
y+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

相關文章