#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
struct number{
ll fz;
ll fm;
};
ll gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
number reduction(number r)
{
if(r.fm<0)
{
r.fm=-r.fm;
r.fz=-r.fz;
}
else if(r.fz==0)
{
r.fm=1;
}
else
{
int d=gcd(abs(r.fz),abs(r.fm));
r.fm/=d;
r.fz/=d;
}
return r;
}
number add(number a,number b)
{
number r;
r.fm=a.fm*b.fm;
r.fz=a.fz*b.fm+a.fm*b.fz;
return reduction(r);
}
void print(number r)
{
reduction(r);
if(r.fm==1)
printf("%lld\n",r.fz);
else if(abs(r.fz)>r.fm)
{
printf("%lld %lld/%lld\n",r.fz/r.fm,abs(r.fz)%r.fm,r.fm);
}
else
printf("%lld/%lld\n",r.fz,r.fm);
}
int main()
{
int n;
scanf("%d",&n);
number sum,temp;
sum.fm=1;
sum.fz=0;
for(int i=0;i<n;i++)
{
scanf("%lld/%lld",&temp.fz,&temp.fm);
sum=add(sum,temp);
}
print(sum);
return 0;
}
【分析】
要注意化简
每一步都要,不然容易溢出
还有就是计算的时候要加上绝对值
化简的三个条件要记住:
①分子为0
②分母为负数
③可以约分
还有输出的两个特殊情况
带分数
还有假分数