有理数四则运算
题目描述
本题要求编写程序,计算 2 个有理数的和、差、积、商。
输入格式
输入在一行中按照 a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。
输出格式
分别在 4 行中按照 有理数1 运算符 有理数2 = 结果
的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b
,其中 k
是整数部分,a/b
是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf
。题目保证正确的输出中没有超过整型范围的整数。
输入样例1
1 | 2/3 -4/2 |
输出样例1
1 | 2/3 + (-2) = (-1 1/3) |
输入样例2
1 | 5/3 0/6 |
输出样例2
1 | 1 2/3 + 0 = 1 2/3 |
问题解决
解题思想
这道题是我刷PAT乙级以来最费时间的一次了,前前后后产生了好多细节错误。这里给出的示例代码也不简洁,但仍然给出的原因是这样较冗长一些的代码可能更便于我们理解题目的解决过程。
解决本题的要点是用结构体类型来存储有理数的各要素,对每一次输出的操作数或结果数都要进行相应的化简,包括分子分母要约分为最简;计算时要用分式进行(整数部分要转化到分式中),+
与-
运算前还需要通分。
输出格式的控制涉及很多的细节,比如:
- 负数加括号
- 分子分母能约分的要约分(这就要求分子分母的最大公约数)
- 分母为0时直接输出
Inf
具体见下方示例代码。其次进行除运算时,结果有理数的分母可能为负,要将其转移到分子上,以便后续统一处理。
坑点提醒
- 有理数的分子分母及整数部分要定义为long long型,除法或乘法运算可能会产生很大的中间数。
- 求最大公约数时不要使用穷举法,这样会导致测试点2与测试点3超时,应使用辗转相除法,这也是看了许多大佬的博客才得知的。
代码示例(C/C++)
1 |
|
题目来源:PAT乙级1034
作者:CHEN, Yue
单位:浙江大学