一个关于求a 和b的最大公约数与最小公倍数;
问题:假如输入 3和7,为何不能求出最小公倍数???package package1;import java.util.Scanner;
class 最大公约数{
public int f(int a,int b){
if(a<b){
int m;
m=a;
a=b;
b=m;
}
if(a%b==0) return b;
else  return f(b,a%b);
}
}public class 最小公倍数  extends 最大公约数{
public int f(int a,int b){
    int m;
        m=super.f(a,b);
        System.out.println(m);

        return ((a*b)/m);
       

}
public static void main(String[] args) {
最大公约数   gcd=new 最大公约数();
最小公倍数   gcd1=new 最小公倍数();
Scanner sc1=new Scanner(System.in);
Scanner sc2=new Scanner(System.in);

System.out.println("请输入两个正整数:");

int a=sc1.nextInt();
int b=sc2.nextInt();

int m=gcd.f(a, b);
System.out.println(a+"和"+b+"的最大公约数为:"+m);

int n=gcd1.f(a, b);
System.out.println(a+"和"+b+"的最小公倍数为:"+n);



}}
假如输入 3和7,为何不能求出最小公倍数???

解决方案 »

  1.   

    从宏观上来讲,“最小公倍数”并不是“最大公约数”的子类,这样设计是违背常理的,你既然用辗转相除得到了最大公约数,为什么不直接算出最小公倍数?
    况且,你这个叫重写,不叫重载。
    问题就出在“ return f(b,a%b);”这句话上,你此时调用的已经是子类的方法,父类会通过值传递的方式去传递给子类的方法,所以肯定会出现逻辑上的错误。
    在平时的项目当中,也要遵从“多聚合,少继承“的原则,项目中继承的大多是Java的库类,很少用到咱平时练的那些”纠结的继承程序“。这种纠结的程序果断pass掉,把学习的重点放在集合、IO、多线程上面。
      

  2.   

    题目要求父类求出最大公约数,子类必须重写这个方法求出其最小公倍数!并且调用父类的方法然后将乘积(a*b)/m返回。
      

  3.   

    题目要求父类求出最大公约数,子类必须重写这个方法求出其最小公倍数!并且调用父类的方法然后将乘积(a*b)/m返回。
      

  4.   

    当然是中国人写的书了;
    原题目是这样的:
    写一个类,该类有一个方法public int f(int a,int b),该方法返回a和b的最大公约数。然后在编写一个子类,要求子类重写这个f方法,而且重写的方法将返回a和b的最小公倍数。要求在重写的方法的方法体中首先调用被隐藏的方法返回a和b的最大公约数m,然后再将乘积(a*b)/m返回。要求在应用程序的主类中分别使用父类和子类创建对象,并且调用方法f计算两个正数的最大公约数与最小公倍数.