【问题描述】
设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。
这个类的构造方法是:Fraction(int a, int b)构造一个a/b的分数,需要对分数约分,如 6/8需转换为 3/4。
这个类要提供以下的功能:
1、将分数转换为double double toDouble();
2、将自己的分数和另一个分数相加,产生一个新的Fraction的对象 public Fraction add(Fraction other)
3、将自己的分数和另一个分数相乘,产生一个新的Fraction的对象 public Fraction multiply(Fraction other)
4、重写toString 方法,将分数自己以“分子/分母”的形式返回。如果分数是1/1,4/2应该输出1,2。当分子大于分母时,不需要提出整数部分,即31/30是一个正确的返回。
【输入形式】
分别输入两个分数的分子和分母,中间以空格分隔。
【输出形式】
测试程序自己输出。
【样例输入输出①】
first number,fenzi fenmu
3 6
second number,fenzi fenmu
5 15
first Fraction:1/2
first output as double:0.50
second Fraction:1/3
second output as double:0.33
result of two Fraction add:5/6
result of two Fraction multiply:1/6
import java.util.Scanner;
class Fraction {
int zi,mu;
Fraction(int zi,int mu){
this.zi=zi;
this.mu=mu;
}
double toDouble() {
return (double)zi/mu;
}
Fraction add(Fraction r) {
Fraction s = new Fraction(1,0);
s.zi=r.zi*mu+r.mu*zi;
s.mu=r.mu*mu;
return s;
}
Fraction multiply(Fraction r) {
Fraction s = new Fraction(0,1);
s.zi=r.zi*zi;
s.mu=r.mu*mu;
return s;
}
public String toString() {
/*
这里采用“辗转相除法”求两个整数的最大公因数。
辗转相除法:较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,(***注意是除不是除以***)
如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
*/
int r=1,x=zi,y=mu;
if(x>y) {
int t;
t=x;
x=y;
y=t;
}
while(r!=0) {
r=y%x;
y=x;
x=r;
}
zi = zi/y;
mu=mu/y;
if(zi==mu) {
return "1";
}
else {
return zi+"/"+mu;
}
}
}
public class TestFraction {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int fz, fm;
System.out.println("first number,fenzi fenmu");
fz = sc.nextInt();
fm = sc.nextInt();
Fraction f1 = new Fraction(fz, fm);
System.out.println("second number,fenzi fenmu");
fz = sc.nextInt();
fm = sc.nextInt();
Fraction f2 = new Fraction(fz, fm);
System.out.println("first Fraction:" + f1);
System.out.printf("first output as double:%.2f\n", f1.toDouble());
System.out.println("second Fraction:" + f2);
System.out.printf("second output as double:%.2f\n", f2.toDouble());
System.out.println("result of two Fraction add:" + f1.add(f2));
System.out.println("result of two Fraction multiply:" + f1.multiply(f2));
sc.close();
}
}