L1-009 N个数求和
Statement
Metadata
- 作者: 陈越
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 400 ms
- 内存限制: 64 MB
本题的要求很简单,就是求N
个数字的和。麻烦的是,这些数字是以有理数分子/分母
的形式给出的,你输出的和也必须是有理数的形式。
输入格式
输入第一行给出一个正整数N
(a1/b1 a2/b2 ...
给出N
个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分
,其中分数部分写成分子/分母
,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1
输出样例1
输入样例2
输出样例2
输入样例3
输出样例3
Solution
#include <ctype.h>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long LL;
const double PI = 3.14159265358979323846264338327;
const double E = 2.718281828459;
const double eps = 1e-6;
const int MAXN = 0x3f3f3f3f;
const int MINN = 0xc0c0c0c0;
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;
LL gcd(LL x, LL y) {
LL r;
while (1) {
r = x % y;
if (r == 0)
break;
x = y;
y = r;
}
return y;
}
int main() {
int n;
cin >> n;
LL a, b, c, d;
scanf("%lld/%lld", &a, &b);
for (int i = 1; i < n; i++) {
scanf("%lld/%lld", &c, &d);
LL temp = b * d / gcd(b, d);
a *= (temp / b);
a += (c * (temp / d));
b = temp;
temp = gcd(a, b);
a /= temp;
b /= temp;
}
LL vis = a / b;
a %= b;
if (vis) {
printf("%lld", vis);
if (a) {
if (vis < 0 && a > 0)
a *= -1;
printf(" %lld/%lld", a, abs(b));
}
} else if (a) {
if (b < 0 && a > 0)
a *= -1, b *= -1;
printf("%lld/%lld", a, abs(b));
} else
cout << 0;
cout << endl;
}
Last update: May 4, 2022