其实也是道简单题,
注意几个点:
1.所有结果可以分为 正带分数,正纯分数,零,负纯分数,负带分数
2.long long 类型的相关知识
3.gcd和lcm的求法要熟练,约分通分都有用。
4.这题的最后输出注意下对空格的控制
#include<stdio.h>
long long gcd(long long a,long long b)
{
long long temp;
if(a<b)
{
temp=a;
a=b;
b=temp;
}
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
return a;
}
long long lcm(long long a,long long b)
{
long long y=gcd(a,b);
long long x=a;
x*=b;
x/=y;
return x;
}
int main()
{
int num,i;
int arr[105],brr[105],crr[105];
scanf("%d",&num);
long x1,x2;
long long xxx=1;
long long sum=0;
for(i=0;i<num;i++)
{
scanf("%lld/%lld",&x1,&x2);
if((x1<0&&x2<0)||(x1>0&&x2>0))
arr[i]=1;
else
arr[i]=0;
if(x1<0) x1=-x1;
if(x2<0) x2=-x2;
brr[i]=x1;
crr[i]=x2;
xxx=lcm(xxx,x2);
}
for(i=0;i<num;i++)
{
if(arr[i])
{
sum+=(brr[i]*(xxx/crr[i]));
}
else
{
sum-=(brr[i]*(xxx/crr[i]));
}
}
long long ax=sum/xxx;
long long bx=sum-ax*xxx;
long long z=gcd(bx,xxx);
bx/=z;
xxx/=z;
if(ax==0&&bx==0)
{
printf("0\n");
return 0;
}
if(ax!=0)
{
printf("%lld",ax);
if(bx!=0)
{
if(xxx<0)
{
xxx=-xxx;
printf(" -");
}
else
printf(" ");
printf("%lld/",bx);
printf("%lld\n",xxx);
}
else
printf("\n");
}
else
{
if(xxx<0)
{
xxx=-xxx;
printf("-");
}
printf("%lld/",bx);
printf("%lld\n",xxx);
}
return 0;
}