最大公约数
提示:几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数
前言
一共有4种性能不断提高的代码如下:
一、暴力遍历法
public static int getGreatestCommonDivisor(int a, int b){
int big = a>b ? a:b;
int small = a<b ? a:b;
if(big%small == 0){
return small;
}
for(int i= small/2; i>1; i--){
if(small%i==0 && big%i==0){
return i;
}
}
return 1;
}
public static void main(String[] args) {
System.out.println(getGreatestCommonDivisor(25, 5));
System.out.println(getGreatestCommonDivisor(100, 80));
System.out.println(getGreatestCommonDivisor(27, 14));
}
使用暴力枚举的方法,从较小整数的一半开始,试图找到一个合适的整数 i,看看这个整数能否被 a 和 b 同时整除。
二、国外古代的辗转相除法
public static int getGreatestCommonDivisorV2(int a, int b){
int big = a>b ? a:b;
int small = a<b ? a:b;
if(big%small == 0){
return small;
}
return getGreatestCommonDivisorV2(big%small, small);
}
public static void main(String[] args) {
System.out.println(getGreatestCommonDivisorV2(25, 5));
System.out.println(getGreatestCommonDivisorV2(100, 80));
System.out.println(getGreatestCommonDivisorV2(27, 14));
}
三.我国古代的更相减损术
public static int getGreatestCommonDivisorV3(int a, int b){
if(a == b){
return a;
}
int big = a>b ? a:b;
int small = a<b ? a:b;
return getGreatestCommonDivisorV3(big-small, small);
}
public static void main(String[] args) {
System.out.println(getGreatestCommonDivisorV3(25, 5));
System.out.println(getGreatestCommonDivisorV3(100, 80));
System.out.println(getGreatestCommonDivisorV3(27, 14));
}
优点:避免了转转相除法的大规模取模运算
缺点:运算次数比除法多,当两个数字差距太大时还不如第一种方法
四.更相减损plus
偶数除2,奇数相减,相等返回
public static int gcd(int a, int b){
if(a == b){
return a;
}
if((a&1)==0 && (b&1)==0){
return gcd(a>>1, b>>1)<<1;
} else if((a&1)==0 && (b&1)!=0){
return gcd(a>>1, b);
} else if((a&1)!=0 && (b&1)==0){
return gcd(a, b>>1);
} else {
int big = a>b ? a:b;
int small = a<b ? a:b;
return gcd(big-small, small);
}
}
public static void main(String[] args) {
System.out.println(gcd(25, 5));
System.out.println(gcd(100, 80));
System.out.println(gcd(27, 14));
}
总结
更相减损plus
YYDS