分数格式:a/b
输入:分子1:2
分母1:4
分子2:3
分母2:9
输出:分数1化简结果:1/2
分数1 + 分数2 = 5/6
分数1 * 分数2 = 1/6
public class Main {
static Fen huajian(Fen f) {// 分数化简
// 如果分母为负数,令分子和分母都变为相反数
if (f.down < 0) {
f.up = -f.down;
f.down = -f.down;
}
// 如果分子为0,令分母为1
if (f.up == 0) {
f.down = 1;
} else {
int d = fun(Math.abs(f.up), Math.abs(f.down));// 分子分母的最大公约数
f.up /= d;// 约去最大公约数
f.down /= d;
}
return f;
}
static int fun(int a, int b) {// 求a和b的最大公约数
if (b == 0)
return a;
else
return fun(b, a % b);
}
static Fen add(Fen a, Fen b) {// 加法(减法就是把加号换成减号)
Fen f = new Fen();
f.up = a.up * b.down + b.up * a.down;
f.down = a.down * b.down;
f = huajian(f);
return f;
}
static Fen multi(Fen a, Fen b) {// 乘法(除法就是把b颠倒再做乘法)
Fen f = new Fen();
f.up = a.up * b.up;
f.down = a.down * b.down;
f = huajian(f);
return f;
}
static void show(Fen f) {// 输出分数的正确格式
f = huajian(f);
if (f.down == 1)// 整数
System.out.println(f.up);
else if (Math.abs(f.up) > f.down) {// 假分数
System.out.println(f.up / f.down + " " + Math.abs(f.up) % f.down + "/" + f.down);
} else {// 真分数
System.out.println(f.up + "/" + f.down);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Fen f1 = new Fen();
// 分数1
System.out.print("分子1:");
f1.up = in.nextInt();
System.out.print("分母1:");
f1.down = in.nextInt();
// 分数2
Fen f2 = new Fen();
System.out.print("分子2:");
f2.up = in.nextInt();
System.out.print("分母2:");
f2.down = in.nextInt();
if (f1.down == 0 || f2.down == 0) {// 分母不能为0
System.out.println("Wrong!");
return;
}
Fen f3 = new Fen();
// 化简
System.out.print("分数1化简结果:");
show(f1);
// 相加
System.out.print("分数1 + 分数2 = ");
show(add(f1, f2));
// 相乘
System.out.print("分数1 * 分数2 = ");
show(multi(f1, f2));
}
}
class Fen {
int up;// 分子
int down;// 分母
}