P1572 题解
这题细节还挺多的。
本题可以直接依次读入并将读入的分数相加(减去一个分数可转化为加上该分数的相反数)。
由于 int 可以带符号读入,所以无需注意符号,直接全部相加即可。
我们通分可得:
注意要边计算边约分,否则可能溢出。
最后要处理一下符号。
输出时注意:如果分子为
代码是目前题解区里最短的。
#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;
}