题目链接:1034 有理数四则运算 (20 point(s))
题目描述
本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式
输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。
测试样例
1)输入:
2/3 -4/2
1)输出:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
2)输入:
5/3 0/6
2)输出:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
3)输入:
4/5 -12/15
3)输出:
4/5 + (-4/5) = 0
4/5 - (-4/5) = 1 3/5
4/5 * (-4/5) = (-16/25)
4/5 / (-4/5) = (-1)
4)输入:
2147483647/2 2/1
4)输出:
1073741823 1/2 + 2 = 1073741825 1/2
1073741823 1/2 - 2 = 1073741821 1/2
1073741823 1/2 * 2 = 2147483647
1073741823 1/2 / 2 = 536870911 3/4
分析?
题目也玩文字游戏了。。。PAT的第3组,第4组数据是大数。(计算过程中会超int,但是结果能约分使得结果在int范围内)
代码?
/*********************************************************************************
Submit Time Status Score Problem Compiler Run Time User
7/17/2019, 23:27:10 Accepted 20 1034 Java (openjdk) 91 ms wowpH
*********************************************************************************/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// "\\s|/"是正则表达式,split()用空格和斜杠分割字符串
String[] s = sc.nextLine().split("\\s|/"); // 得到分子,分母,分子,分母
sc.close();
Number one = new Number(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
Number two = new Number(Integer.parseInt(s[2]), Integer.parseInt(s[3]));
char[] op = { '+', '-', '*', '/' }; // 运算符
for (int i = 0; i < 4; ++i) {
one.output();
System.out.print(" " + op[i] + " ");
two.output();
System.out.print(" = ");
one.operate(two, op[i]).output(); // 运算并输出结果
System.out.println();
}
}
}
class Number { // 操作数
long fz, fm; // 分子,分母
public Number(long fz, long fm) {
this.fz = fz;
this.fm = fm;
if (0 != fz && 0 != fm) { // 若分子,分母都不为0,则约分
long gcd = gcd(Math.abs(fz), fm); // 最大公约数
this.fz /= gcd;
this.fm /= gcd;
}
}
public Number operate(Number num, char ch) { // 四则运算运算,返回结果
if ('+' == ch) { // 加法
return new Number(fz * num.fm + num.fz * fm, fm * num.fm);
} else if ('-' == ch) { // 减法
return new Number(fz * num.fm - num.fz * fm, fm * num.fm);
} else if ('*' == ch) { // 乘法
return new Number(fz * num.fz, fm * num.fm);
} else { // 除法,'/' == ch
return divide(num);
}
}
private Number divide(Number num) { // 除法运算,返回结果
if (0 == num.fz) { // 除数为0
return new Number(1, 0); // 返回分母为0的Number对象
} else if (num.fz < 0) { // 除数是负数
return new Number(-fz * num.fm, -fm * num.fz);// 将负号移到分子,返回结果
}
return new Number(fz * num.fm, fm * num.fz);// 返回结果
}
public void output() { // 输出操作数
if (0 == fm) { // 分母为0
System.out.print("Inf");
} else if (0 == fz) { // 分子为0
System.out.print(0);
} else {
if (fz < 0) { // 负数
System.out.print("("); // 输出括号
}
long a = Math.abs(fz); // 分子的绝对值
if (0 == a % fm) { // 整数
System.out.print(fz / fm);
} else if (a > fm) { // 带分数
System.out.print((fz / fm) + " " + (a % fm) + "/" + fm);
} else { // 真分数
System.out.print(fz + "/" + fm);
}
if (fz < 0) { // 负数
System.out.print(")"); // 输出括号
}
}
}
private static long gcd(long a, long b) { // 求最大公约数,a和b均为正数
while (0 != a % b) { // a不是b的倍数
long temp = a;
a = b;
b = temp % b; // 余数赋值给b
}
return b; // 返回最大公约数
}
}
版权声明
- 转载、参考、引用必须在首页添加如下文字:
[PAT(B) 1034 有理数四则运算(Java)—wowpH](https://blog.csdn.net/pfdvnah/article/details/96381865)
- 代码原创,公开引用不能删除首行注释(作者,版本号,时间等信息);
- 如果有疑问欢迎评论区留言,尽量解答;
- 如果有错误,还望大侠评论区指正。