PTA 天梯赛 L1-009 N个数求和

分析:先根据分数加法的公式累加,后分离出整数部分和分数部分。
分子和分母都在长整型内,所以不能用int存储,否则有一个测试点不通过。
一开始一直是浮点错误,按理来说应该是出现了/0或者%0的情况,找了半天也不知道错在哪里。
后来注意到应该在累加的时候考虑是否会超出long long的范围,所以在累加每一步之前进行分子分母的约分处理,然后就AC了。
以及:abs()在stdlib.h头文件里面。
应该还要考虑整数和小数部分都为0时候输出0的情况,但是测试用例中不涉及,所以如果没有最后两句也是可以AC的。

#include
#include
#include
#include
using namespace std;
long long gcd(long long a,long long b)
{
    if(b == 0)
        return a;
    return gcd(b,a % b);
}
int main()
{
    int n;
    long long val,suma = 0,sumb = 1;
    scanf("%d",&n);
    for(int i = 0;i < n; i++)
    {
        long long x,y;
        scanf("%lld/%lld",&x,&y);
        val = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma),abs(sumb)); //辗转相除求公约数
        sumb /= val;//每一步都化简,避免数据类型溢出
        suma /= val;
        suma = x * sumb + suma * y;
        sumb = y * sumb;
    }
    long long x = suma / sumb;
    suma = suma - (sumb * x);
    val = (suma == 0 || sumb == 0) ? 1 : gcd(abs(suma),abs(sumb));
    suma /= val;
    sumb /= val;
    if(x)
    {
        printf("%lld",x);
        if(suma)
            printf(" ");
    }
    if(suma)
        printf("%lld/%lld",suma,sumb);
    if(x == 0 && suma == 0)
        printf("0");
    return 0;
}

 

你可能感兴趣的:(PTA练习)