最大公约数的算法一般就是辗转相除法了。直观易懂。但是取模运算却是很耗时的。
看代码:
package a;
public class CopyOfTest1 {
public static void main(String s[]) {
System.out.println(fun(7, 22));
}
// 求ab的最大公约:辗转相除法
public static int fun1(int a, int b) {
return b == 0 ? a : fun1(b, a % b);
}
// 求ab的最大公约数
public static int fun(int a, int b) {
if (a < b) {
return fun(b, a);
}
if (b == 0) {
return a;
}
if (isEven(a)) {
if (isEven(b)) {
return fun(a >> 1, b >> 1) << 1;
} else {
return fun(a >> 1, b);
}
} else {
if (isEven(b)) {
return fun(a, b >> 1);
} else {
return fun(b, a - b);
}
}
}
public static boolean isEven(int a) {
if ((a & 0x1) == 0) {
return true;
}
return false;
}
}
看了编程之美上的算法。根据最大公约数的特点,
f(x,y)=f(kx,ky)=kf(x,y)
f(x,y)=f(px1,y)=f(x1,y):y不能被p整除
f(x,y)=f(x,py1)=f(x,y1):x不能被p整除
f(x,y)=f(y,x-y):这个公式对任何的xy都适用
于是有了上面的fun算法。