模拟题
题解
每次将两个分数进行相加,到最后再将结果化成带分数。主要考察的最大公约数与最小公倍数。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
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
");
else if(x && ans.a == 0) {
printf("%lld
", x);
}else if(x == 0 && ans.a) {
printf("%lld/%lld
", ans.a, ans.b);
}else {
printf("%lld %lld/%lld
", 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;
}