下面是Java学习过程中的一道练习题,求两个数的最大公约数和最小公倍数,我编写的代码如下:
<span style="font-family: Arial, Helvetica, sans-serif;">package Test;</span>
/**
* 计算最大公约数和最小公倍数
* @author Yifan
* @version 1.0
*/
class Divisor
{
/**
* 求最大公约数
* @param a
* @param b 所求的两个数字
* @return 返回a和b的最大公约数
*/
int f(int a,int b)
{
int temp;
if(a==b)
return a;
else if(a<b)
{
temp=a;
a=b;
b=temp;
}
temp=a%b;
if(temp==0)
return b;
else
{
return f(b,temp);
}
}
}//辗转相除法求最大公约数
class Multiple extends Divisor
{
/**
* 调用最大公约数的算法,计算最小公倍数
* @return 返回最小公倍数
*/
int f(int a,int b)
{
/* int c,d;
d = a*b;
c = super.f(a,b);
return d/c;*/ //该方法中的父类是个递归方法,在递归时会调用子类重写的方法
Divisor Div = new Divisor();
int c = Div.f(a, b);
return (a*b)/c;
}
}//求最小公倍数
public class Sum
{
/**
* 主方法输出a和b的最大公约数和最小公倍数
* @param args 形参变量
*/
public static void main(String[] args)
{
int a,b,divisor,multiple;
a = 600;
b = 1515;//待求的两个数
Divisor Di = new Divisor();
Multiple Mu = new Multiple();
divisor = Di.f(a,b);
multiple = Mu.f(a,b);
System.out.println("最大公约数和最小公倍数分别是:"+divisor+","+multiple);
}
}
可以看到,Multiple类继承了Divisor类,重写并在重写的方法中调用父类的该递归方法时,导致父类在递归时并不是调用自己,而是调用子类的重载方法,导致计算最小公倍数计算错误。 目前解决的方法,我只想到以上代码中的一种方法,即在子类中创建父类的实例,用实例来调用父类的递归方法。欢迎大家提供其他解决该问题的好办法!!!