计算分数
题目描述
Csh 被老妈关在家里做分数计算题,但显然他不愿意做这么多复杂的计算。况且在家门口还有 Xxq 在等着他去一起看电影。为了尽快地能去陪 Xxq 看电影,他把剩下的计算题交给了你,你能帮他解决问题吗?
输入格式
输入一行,为一个分数计算式。
计算式中只包含数字、+
、-
、/
。其中 /
为分数线,分数线左边为分子,右边为分母。输入数据保证不会出现繁分数。如果输入计算式的第一项为正,不会有前缀 +
号;若为负,会有前缀 -
号。
所有整数均以分数形式出现。
输出格式
输出一行,为最后的计算结果(用为整数则用整数表示,否则用最简分数表示)。
保证答案内出现的所有数(如果答案是分数即为分子和分母)均在 32 32 32 位带符号整数的表示范围之内。
样例 #1
样例输入 #1
2/1+1/3-1/4
样例输出 #1
25/12
提示
数据范围及约定
对于所有测试点,输入计算式长度在 100 100 100 以内,分子、分母在 1000 1000 1000 以内。同时保证,直接从前往后直接计算分数的和或者差,然后立刻化简,这么做的中间结果不会超过 int 的范围。
注意输入的分数不一定是最简分数。
2024/2/13 添加 2 组 hack 数据。
问题链接: P1572 计算分数
问题分析: 分数问题,不解释。
参考链接: (略)
题记: (略)
AC的C++语言程序如下:
/* P1572 计算分数 */
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main()
{
// 计算分数和,放在a/b中
int a = 0, b = 1, c, d;
while (scanf("%d/%d", &c, &d) != EOF) {
a = a * d + b * c, b *= d;
int gcd = __gcd(a, b);
a /= gcd, b /= gcd;
}
// 处理符号
if (a < 0 && b < 0) a = -a, b = -b;
else if (a < 0) a = -a, putchar('-');
else if (b < 0) b = -b, putchar('-');
// 输出结果
if (a == 0) putchar('0');
else if (b == 1) cout << a;
else cout << a << '/' << b;
return 0;
}
文章评论