#include using namespace std; int a, B, c, d; /** 测试用例: 2/1+1/3-1/4 答案:25/12 -2/1+1/3-1/4 答案:-23/12 测试点6 7/4+1/3+8/5-3/2-6/9-6/4-5/2+6/2+4/9-3/9-2/3+5/2-5/4+3/9-3/8-5/8+6/8+3/8-4/7-5/7-3/6+6/9-5/6-5/7-5/2 */ int gcd(int x, int y) { if (y == 0) return x; return gcd(y, x % y); } int lcm(int x, int y) { return x * y / gcd(x, y); } int main() { //和我一起念:scanf大法好!! scanf("%d/%d", &a, &b); //不断读取后面的数字,这玩意居然还能读入负号,牛! while (scanf("%d/%d", &c, &d) != EOF) { //通分,分母取最小公倍 int e = lcm(b, d); //分子乘啊乘啊乘 int f = e / b * a + e / d * c; //求最大公约数,约分 int g = gcd(e, f); a = f / g; b = e / g; } //因为求负数最大公约,最小公倍也是可以的,但可能最终会出现1259/-360这样的情况 //如果这时,需要特判一下,写成:-1259/360 if (b < 0) a = -a, b = -b; //如果分母是1,就输出分子 if (b == 1) printf("%d\n", a); else printf("%d/%d\n", a, b); return 0; }