Java 实现分数的相加相乘化简

0x01 要求:

设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。这个类的构造方法是:

Fraction(int a, int b)    构造一个a/b的分数。

这个类要提供以下的功能:

double toDouble();    将分数转换为double

Fraction plus(Fraction r);

将自身和r的分数相加,产生一个新的Fraction的对象。注意小学五年级学过两个分数如何相加。

Fraction multiply(Fraction r);

将自身和r的分数相乘,产生一个新的Fraction的对象。

void print();

将自身以“分子/分母”的形式输出到标准输出,并带有回车换行。

需要考虑以下情况:

当分母为0时,显示“错误,分母不能为0”。

当分子为0时,显示0

当分母为1时,直接显示分子

分数为负数时,负号显示在最前面

分数显示为最简形式。如2/4应该被约分为1/2。

类 Fraction 中可以用以下方法进行约分和调整负号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   private void yuefen() {
        int aa = (int) Math.abs(a);
        int ab = (int) Math.abs(b);
        if (a * b >= 0) {    // 调整负号
            a = aa;
            b = ab;
        }
        else {
            a = -aa;
            b = ab;
        }
        for (int i = ((aa < ab) ? aa : ab); i > 1; i--) {    // 求最大公因数,并约分
            if (a % i == 0 && b % i == 0) {
                a /= i;
                b /= i;
                break;
            }
        }
    }

完成Fraction类定义后,使用以下main函数(请勿修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Scanner;

public class Main {

     public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
         Fraction a = new Fraction(in.nextInt(), in.nextInt());
         Fraction b = new Fraction(in.nextInt(),in.nextInt());
         a.print();
         b.print();
         a.plus(b).print();
         a.multiply(b).plus(new Fraction(5,6)).print();
         a.print();
         b.print();
         in.close();
     }

}

注意,你的类的定义应该这样开始:

class Fraction {

也就是说,在你的类的class前面不要有public。

输入格式:程序运行时会输入4个数字,分别构成两个分数,依次是分子和分母。

输出格式:输出由上面的 main 函数完成,不需要额外编写代码。

输入样例:

1
2 4 1 3

输出样例:

1
2
3
4
5
6
7
8
9
10
11
1/2

1/3

5/6

1

1/2

1/3

0x02 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.Scanner;
class Fraction{

private int a; //分子
private int b; //分母

public Fraction(int a, int b) {
this.a = a;
this.b = b;
}

public Fraction() {

}

public void print() {
if (a == b && a !=0){ //分子等于分母
System.out.println(1);
return;
}
if (b == 1){ //分子等于1
System.out.println(a);
return;
}
if (b == 0){ //分子为0
System.out.println("错误,分母不能为0");
return;
}
this.yueFen();
System.out.println(a+"/"+b); //正常输出分数
}

public double toDouble(){ //转换分数为double
return (double) a/(double) b;
}

public Fraction plus(Fraction fraction) { //分数相加
Fraction fraction1 = new Fraction(); //需要返回的结果 2/4+6/5 = [(2*5)+(6*4)]/20
fraction1.b = this.b * fraction.b; // 4*5 = 20
fraction1.b = fraction1.b/GCD(this.b, fraction.b); //GCD = 1
// System.out.println(this.a +" "+this.b+" " + fraction.a+" " + fraction.b);
// System.out.println("gcd="+GCD(this.b, fraction.b));
fraction1.a = ((this.a* fraction.b)+(fraction.a*this.b))/GCD(this.b, fraction.b);
// System.out.println("fraction1.a="+fraction1.a);
// System.out.println("fraction1.b="+fraction1.b);
return fraction1;
}

public Fraction multiply(Fraction fraction) { //分数相乘
return new Fraction((this.a* fraction.a),(this.b* fraction.b));
}

private int GCD (int a,int b) {
int min = a<b?a:b;
int gcd = 1;
for (int i = min;i >= 1;i --) {
if (a%i == 0 && b%i == 0) {
gcd = i;
break;
}
}
return gcd;
}

private void yueFen(){
int aa = (int) Math.abs(a);
int bb = (int) Math.abs(b);
if (a*b >=0){ //调整负号到分子
a = aa;
b = bb;
}else {
a = -aa;
b = bb;
}
for (int i = (Math.min(aa, bb)); i >1 ; i--){ //求最大公因数,约分
if(a % i ==0&&b%i==0){
a/=i;
b/=i;
break;
}
}
}
}

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Fraction a = new Fraction(in.nextInt(),in.nextInt());
Fraction b = new Fraction(in.nextInt(),in.nextInt());
a.print();
b.print();
a.plus(b).print();
a.multiply(b).plus(new Fraction(5,6)).print();
a.print();
b.print();
in.close();
}
}