1081 Rational Sum (20 分)
题意
给出n个分数,求分数的和。分数前面可能有负号。若答案为假分数,则要按照带分数的形式输出;整数则按整数输出;否则按真分数输出。
注意点
- 注意最后输出时,需要按整数、带分数、真分数的情况分类处理。
- 注意最终结果为0的处理。
- 必须在每一步加法后都进行约分,如果等全部加完后才约分,则会溢出。
- 计算最大公约数时,要注意是计算分子分母绝对值的公约数。
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;
}