题目简介
一行由若干个分数(格式:分子 / 分母,1≤分子,分母≤1e9)加减运算组成的表达式,计算并以最简分数形式输出表达式的值 (保证:-1e18≤分子,分母≤1e18)。
说明
分数模板练习。再重载一个减号似乎是更为方便的做法。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
int len, pos;
ll tmp, num;
struct frac
{
ll nume, deno;
ll gcd(ll a, ll b)
{
a = abs(a); b = abs(b);
return b ? gcd(b, a % b) : a;
}
void reduct()
{
if(!nume) {
deno = 1;
return;
}
ll g = gcd(nume, deno);
nume /= g; deno /= g;
return;
}
frac(ll a, ll b = 1)
{
nume = a; deno = b;
(*this).reduct();
}
void print()
{
if(deno == 1) printf("%lld\n", nume);
else printf("%lld/%lld\n", nume, deno);
}
};
frac operator+(const frac& a, const frac& b)
{
frac ret(a.nume*b.deno + b.nume*a.deno, a.deno*b.deno);
ret.reduct();
return ret;
}
void readnum()
{
while (pos < len && isdigit(s[pos])) {
num = num * 10 + s[pos] - '0';
++pos;
}
}
int main()
{
int cas, n;
cin >> cas;
for(int t = 0; t < cas; ++t) {
cin >> n >> s;
len = s.size();
frac ans(0);
for (pos = 0; pos < len;) {
num = 0;
int flag = 1;
if (s[pos] == '+') ++pos;
if (s[pos] == '-') {
flag = -1;
++pos;
}
readnum();
tmp = num * flag; num = 0; ++pos;
readnum();
frac(tmp, num);
ans = ans + frac(tmp, num);
}
printf("case #%d:\n", t);
ans.print();
}
return 0;
}