百度出现浮点错误,都说是溢出导致的,我找了半天,最后调试发现2/5的最大公因子是2,是gcd写错了,返回的最大公因子本来是1的,结果返回了大于1的整数把我的分母给我除成0了。记住是babab吧!
return !b ? a : gcd(a, a % b);
应该改成return !b ? a : gcd(b, a % b)
①一边相加一边化简,否则会发生溢出
②注意分母为1的时候不需要输出分母,同时分子为0时也不需要输出分母(不如将二者统一为分母为1)
③按照规则,down为非负数
#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
struct fraction {
long long up, down;
}f[110];
long long gcd(long long a, long long b)
{
return !b ? a : gcd(a, a % b);
}
fraction reduction(fraction a)
{
if (a.down < 0) {
a.down = -a.down;
a.up = -a.up;
}
if (a.up == 0)
a.down = 1;
else {
long long d = gcd(fabs(a.up), fabs(a.down));
a.up /= d;
a.down /= d;
}
return a;
}
fraction add(fraction a, fraction b)
{
fraction result;
result.up = a.up * b.down + a.down * b.up;
result.down = a.down * b.down;
return reduction(result);
}
int main()
{
int n;
cin >> n;
fraction sum;
sum.up=0;
sum.down=1;
for (int i = 0; i < n; i++)
{
scanf("%lld/%lld", &f[i].up, &f[i].down);
sum = add(sum, f[i]);
}
reduction(sum);
if (sum.down == 1) printf("%lld\n",sum.up);
else if (fabs(sum.up) > sum.down)
printf("%lld %lld/%lld", sum.up / sum.down, abs(sum.up) % sum.down, sum.down);
else
printf("%lld/%lld", sum.up, sum.down);
return 0;
}