1081 Rational Sum (20分)浮点错误,发现问题看两遍没看出来就去调试吧

百度出现浮点错误,都说是溢出导致的,我找了半天,最后调试发现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;
}

猜你喜欢

转载自blog.csdn.net/qq_42835526/article/details/113406067