直接上代码
package main;
public class Gcd {
//穷举法
//复杂度 O(b)即O(N)
public static int loopGcd(int a,int b){
for (int c = a>b?b:a;c >0;c--){
if(a%c ==0 && b%c ==0){
return c;
}
println(c);
}
return 1;
}
//更相减损求大公约数
//以少减多,更相减损
//复杂度 O(N),极端情况下和上面一致,比如b=1
public static int minusGcd(int a,int b){
int tmp;
while (a%b!=0){
tmp = b;
b = a-b;
if(b>0){
a = tmp;
}else {
println(b);
b = -b;
}
}
return b;
}
//取余优化:取一次余然后走gcd
//复杂度 O(N/2)
public static int modMinusGcd(int a,int b){
if(a <1 || b< 1){
return 0;
}
int tmp;
if(a<b){
b = b%a;
if(b == 0){
return a;
}
return minusGcd(a,b);
}else {
tmp = b;
b = a%b;
if(b == 0){
return tmp;
}
return minusGcd(tmp,b);
}
}
//使用辗转相除法
//复杂度 O(lgN),可以用二分法理解
public static int modGcd2(int a,int b){
println("a:"+ Integer.valueOf(a).toString() +" b:" + Integer.valueOf(b).toString());
if(b == 0){
return a;
}
if(a<b) {
return modGcd2(a,b%a);
}else {
return modGcd2(b, a % b);
}
}
//~~仅在 a>b的情况下辗转相除法简化~~
//由于 3%5 余5 所以 a<b的情况下也适用只是多第一次取余
//复杂度 O(lgN)
public static int modStordIntGcd(int a, int b){
println("a:"+ Integer.valueOf(a).toString() +" b:" + Integer.valueOf(b).toString());
return b==0?a:modStordIntGcd(b,a%b);
}
public static void main(String[] args){
println(loopGcd(34,119));
}
}