歐幾里得算法,又稱輾轉相除法,用於求兩個自然數的最大公約數。算法基於數論等式gcd(a,b)=gcd(b,a mod b),其時間複雜度爲O(logk),其中k=max(a,b),若k的位數爲n,則時間複雜度爲O(logn)。時間複雜度的證明比較麻煩,這裏就不證明了,知道是這樣就行了。
輾轉相除法基於如下原理:兩個整數的最大公約數等於其中較小的數和兩數的相除餘數的最大公約數。
輾轉相除法可以用循環或者遞歸的方法來實現。下面用Java分別實現這兩種方法。
package com.cao.test;
import java.util.Scanner;
public class GCD {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int result;
if(a > b)
result = gcd_loop(a,b);
else
result = gcd_loop(b,a);
System.out.println(result);
}
// 遞歸實現輾轉相除法
public static int gcd_recursive(int a,int b)
{
return b == 0 ? a:gcd_recursive(b,a%b);
}
//循環實現輾轉相除法
public static int gcd_loop(int a,int b)
{
while(b != 0)
{
int r = a % b;
a = b;
b = r;
}
return a;
}
}
百度百科中對輾轉相除法作了詳細的解釋,可以參考:輾轉相除法—百度百科