题目链接: https://pintia.cn/problem-sets/994805342720868352/problems/994805386161274880 思路: 分数在加减时,将两个运算数的分母都化成最小公倍数就好了; 最后一个测试点是输出0,不是很懂题目为什么不告诉你0值怎么输出;整数部分是0只要输出分数部分,分数部分是0呢?自己猜一个值输出吗? 代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } ll lcm(ll a, ll b) { return a * b / gcd(a, b); } struct number { ll i, a, b; // i + a / b; void init_() { ll g = gcd(abs(a), b); a /= g; b /= g; } number operator + (const number & x) const { number res; res.i = i + x.i; res.b = lcm(b, x.b); res.a = res.b / b * a + res.b / x.b * x.a; res.i += res.a / res.b; res.a = res.a % res.b; res.init_(); return res; } }; int main() { #ifdef MyTest freopen("Sakura.txt", "r", stdin); #endif int n; scanf("%d", &n); number ans; ans.i = 0; scanf("%lld/%lld", &ans.a, &ans.b); ans.init_(); for(int i = 1; i < n; i++) { number x; x.i = 0; scanf("%lld/%lld", &x.a, &x.b); x.init_(); ans = ans + x; } if(ans.i && ans.a) printf("%lld %lld/%lld", ans.i, ans.a, ans.b); else if(ans.i) printf("%lld", ans.i); else if(ans.a) printf("%lld/%lld", ans.a, ans.b); else printf("0"); return 0; }