P1572 题解

· · 题解

这题细节还挺多的。

本题可以直接依次读入并将读入的分数相加(减去一个分数可转化为加上该分数的相反数)。

由于 int 可以带符号读入,所以无需注意符号,直接全部相加即可。

我们通分可得:\dfrac ab+\dfrac cd=\dfrac{ad+bc}{bd}。

注意要边计算边约分,否则可能溢出。

最后要处理一下符号。

输出时注意:如果分子为 0,直接输出 0;如果分母为 1,则不用输出分母。

代码是目前题解区里最短的。

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d=1;//注意要给 d 赋值
int main(){
    while(~scanf("%d/%d",&a,&b)){//读入
        c=a*d+b*c,d=b*d;//相加,a/b+c/d=(a*d+b*c)/(b*d)
        int g=__gcd(c,d);c/=g,d/=g;//约分
    }if(c<0&&d<0)c=-c,d=-d;//分子分母均为负
    else if(c<0&&d>0)c=-c,putchar('-');//只有分子为负
    else if(c>0&&d<0)d=-d,putchar('-');//只有分母为负
    if(!c)puts("0");//分子为 0
    else if(d==1)cout<<c;//分母为 1
    else cout<<c<<'/'<<d;//无特殊情况
    return 0;
}