1081 Rational Sum (20 分)

题意

给出n个分数,求分数的和。分数前面可能有负号。若答案为假分数,则要按照带分数的形式输出;整数则按整数输出;否则按真分数输出。

注意点

  1. 注意最后输出时,需要按整数、带分数、真分数的情况分类处理。
  2. 注意最终结果为0的处理。
  3. 必须在每一步加法后都进行约分,如果等全部加完后才约分,则会溢出。
  4. 计算最大公约数时,要注意是计算分子分母绝对值的公约数。
const int N=110;
struct Fraction
{
    LL up,down;
}a[N];
int n;

LL gcd(LL a,LL b)
{
    return b?gcd(b,a%b):a;
}

Fraction add(Fraction a,Fraction b)
{
    Fraction c;
    c.down=a.down*b.down;
    c.up=a.up*b.down+b.up*a.down;
    LL d=gcd(abs(c.up),c.down);
    c.up/=d,c.down/=d;
    return c;
}

int main()
{
    cin>>n;

    for(int i=0;i<n;i++) scanf("%lld/%lld",&a[i].up,&a[i].down);

    for(int i=0;i<n-1;i++)
        a[i+1]=add(a[i],a[i+1]);

    LL res=a[n-1].up/a[n-1].down;
    if(res != 0)
    {
        a[n-1].up%=a[n-1].down;
        cout<<abs(res);
    }
    
    if(res && a[n-1].up) cout<<' ';

    if(a[n-1].up != 0)
        cout<<a[n-1].up<<'/'<<a[n-1].down;
    
    if(res == 0 && a[n-1].up == 0)
        cout<<0;
    cout<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-02-21 17:40  Dazzling!  阅读(50)  评论(0编辑  收藏  举报