1.什么是辗转相除法?
记gcd(a,b)为两个整数a和b的最大公约数,gcd(a,b)具有如下性质:
gcd(a,b) = gcd(b,a%b);gcd(a,0)=|a|;
2.错误实践
/**
* 辗转相除法:求最大公约数
* @author liuffei
* @date 2017-5-26
*/
public class Gcd {
public static int gcd(int divisor,int divide){
int tmp = divide;
divide = divisor % divide;
divisor = tmp;
if(divide != 0){
gcd(divisor,divide);
}
return divisor;
}
public static void main(String args[]){
//int result = gcd(10,5);
//System.out.println(result);
int a = 12,b = 18,c = 24;
System.out.println("gcd("+a+","+b+")="+gcd(a,b));
System.out.println("gcd=("+a+","+b+","+c+")="+gcd(gcd(a,b),c));
}
}
执行结果:
gcd(12,18)=18
gcd=(12,18,24)=24
错误原因:执行步骤gcd(12,18)==>gcd(18,12)==>gcd(12,,6)==>divide=0==>return 6==>return 12==>return 18
3.正确操作:
public class Gcd2 {
public static int gcd(int a,int b){
while(b != 0){
int tmp = a % b;
a = b;
b = tmp;
}
return a;
}
public static void main(String args[]){
int result = gcd(10,5);
System.out.println(result);
int a = 12,b = 18,c = 24;
System.out.println("gcd("+a+","+b+")="+gcd(a,b));
System.out.println("gcd=("+a+","+b+","+c+")="+gcd(gcd(a,b),c));
}
}
执行结果:
5
gcd(12,18)=6
gcd=(12,18,24)=6