模拟题
题解
每次将两个分数进行相加,到最后再将结果化成带分数。主要考察的最大公约数与最小公倍数。
代码如下:
#include#include #include #include using namespace std;const int maxn = 110;int n;struct Fraction { long long a,b;}f[maxn];long long _gcd(long long a, long long b) { if(b == 0) return a; else return _gcd(b, a%b);}long long _lcm(long long a, long long b) { long long c = _gcd(a,b); return a/c*b;}Fraction _add(Fraction A, Fraction B) { long long lcm = _lcm(A.b, B.b); A.a = (lcm/A.b)*A.a; B.a = (lcm/B.b)*B.a; A.a += B.a; A.b = lcm; long long gcd = _gcd(abs(A.a), A.b); A.a /= gcd; A.b /= gcd; return A;}void _output(Fraction ans) { long long gcd,x; gcd = _gcd(abs(ans.a), ans.b); ans.a /= gcd; ans.b /= gcd; x = ans.a / ans.b; ans.a %= ans.b; if(x == 0 && ans.a == 0)printf("0\n"); else if(x && ans.a == 0) { printf("%lld\n", x); }else if(x == 0 && ans.a) { printf("%lld/%lld\n", ans.a, ans.b); }else { printf("%lld %lld/%lld\n", x, ans.a, ans.b); }}int main() { while(~scanf("%d", &n)) { Fraction ans; scanf("%lld/%lld", &ans.a, &ans.b); for(int i = 1; i < n; i++) { scanf("%lld/%lld", &f[i].a, &f[i].b); ans = _add(ans, f[i]); } _output(ans); } return 0;}