收获:递归法得求最大公约数m,最小公倍数就是a*b/m
变量名字,在清晰易懂的基础上,能短就短
#include<iostream>
#include<cmath>
using namespace std;
struct RationalNumbers
{
long long numerator;
long long denominator;
} rn[100];
long long gcd(long long numerator,long long denominator)
{
if(denominator==0)
return numerator;
else
return gcd(denominator, numerator % denominator);
}
RationalNumbers reduction(RationalNumbers r)
{
if(r.denominator<0)
{
r.numerator = -r.numerator;
r.denominator = -r.denominator;
}
if(r.numerator==0)
r.denominator = 1;
else
{
long long d = gcd(abs(r.numerator), abs(r.denominator));
r.numerator /= d;
r.denominator /= d;
}
return r;
}
RationalNumbers add(RationalNumbers r1,RationalNumbers r2)
{
RationalNumbers result;
result.numerator = r1.numerator * r2.denominator + r2.numerator * r1.denominator;
result.denominator = r1.denominator * r2.denominator;
return reduction(result);
}
void show(RationalNumbers r)
{
r = reduction(r);
if(r.denominator==1)
printf("%lld", r.numerator);
else if(abs(r.numerator)>r.denominator)
printf("%lld %lld/%lld\n", r.numerator / r.denominator,
abs(r.numerator) % r.denominator,
r.denominator);
else
printf("%lld/%lld\n", r.numerator, r.denominator);
}
int main()
{
int n;
cin >> n;
RationalNumbers sum{0, 1};
for (int i = 0; i < n ; i++)
{
scanf("%ld/%ld", &rn[i].numerator, &rn[i].denominator);
sum = add(sum, rn[i]);
}
show(sum);
getchar();
}
不过,有意思的是我没有通过第三个样例,但最后却拿到了满分