欧几里得算法,又称辗转相除法,用于求两个自然数的最大公约数。算法基于数论等式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;
}
}
百度百科中对辗转相除法作了详细的解释,可以参考: 辗转相除法—百度百科