求最大公約數-輾轉相除法(Java)
阿新 • • 發佈:2019-02-19
言:
求最大公約數的演算法有很多,有更相減損法,輾轉相除法等,但是較易用演算法實現的,且效率相對較高的就是輾轉相除法了。以下介紹用Java實現輾轉相除法,記錄學習通時也當作分享。
原理:
兩個數的最大公約數是指能同時整除它們的最大正整數。
設兩數為a、b(a≥b),求a和b最大公約數
的步驟如下:
(1)用a除以b(a≥b),得
。
(2)若
,則
;
(3)若
,則再用b除以
,得
.
(4)若
,則
;若
,則繼續用
除以
,......,如此下去,直到能整除為止。
其最後一個餘數為0的除數即為
的最大公約數。
例:用輾轉相除法求(80,25)的最大公約數
80÷25=3......5
25÷5=5......0//餘數為零,最大公約數為等式中的除數5
證明:
設兩數為a、b(a>b),用
表示a,b的最大公約數,r=a (mod b) 為a除以b的餘數,k為a除以b的商,即
。輾轉相除法即是要證明
。
第一步:令
,則設
第二步:根據前提可知
第三步:根據第二步結果可知,
也是
的因數
第四步:可以斷定
與
互質(這裡用反證法進行證明:設
,則
,則
,則a與b的一個公約數
,故c非a與b的最大公約數,與前面結論矛盾,則它們互質。又因b=nc,r=(m-kn)c, 因此c也是b與r的最大公約數)從而可知
,繼而
。
Java演算法實現:
演算法實現:
呼叫:
public class zhanzhuan {
int a; //定義被除數
int b; //定義除數
int f(int a,int b) {
this.a=a;
this.b=b;
int c;
if(a<b) { //將a設為較大數
c=a;
a=b;
b=c;
}
int r=a%b;
while(r!=0) { //輾轉相除
a=b;
b=r;
r=a%b;
}
return b; //b為最大公約數
}
}
呼叫:
class test{ //呼叫部分
public static void main(String[] args) {
zhanzhuan z = new zhanzhuan();
z.a=98;
z.b=26;
System.out.println(z.a+"和"+z.b+"兩數的最大公約數是:"+z.f(z.a, z.b));
}
}
結果: