写了一下午终于摆脱了17分。(制作不易,如有帮助点个赞吧)
先上题目:
题目给的样例:
坑点:
对两个数求最大公因数时,有一个数为零;
数据超出了存储范围;
还要注意输出格式
注:走一遍补充样例非常有必要。(文章若有错误请指正,谢谢啦)
补充样例:
补充样例1:
3
-1/1 -1/2 -1/2
输出
-2
补充样例2:
2
0/1 0/1
输出
0
补充样例3:
3
-1/1 -1/2 -1/2 -1/2
输出
-2 -1/2
补充样例4:
1
-5000/600
输出
-8 -1/3
补充样例5:
2
-1/2 -3/2
输出
-2
代码如下:
#include <stdio.h>
#include <stdlib.h>
long long gcd(long long m,long long n)
{
if(m==0||n==0)
return m?m:n;
return m%n?gcd(n,m%n):n;
}
int main()
{
int n = 0;
scanf("%d",&n);
long long fz1,fm1,fz2,fm2;//字面意思,分子1,分母1
scanf("%lld/%lld",&fz1,&fm1);
for(int i = 1;i<n;i++)
{
scanf("%lld/%lld",&fz2,&fm2);
long long lcm = fm1*fm2/gcd(fm1,fm2);//分母最小公倍数
//fm1 = fm1*fm2/gcd(fm1,fm2);
fz1 = lcm/fm1*fz1 + lcm/fm2*fz2;//分子求和
long long gcd1 = gcd(llabs(fz1),llabs(lcm));//准备化简
fz1/=gcd1;
lcm/=gcd1;
fm1 = lcm;
}
long long gcd1 = gcd(llabs(fz1),llabs(fm1));//防止只有一组数据的输入
fz1/=gcd1;
fm1/=gcd1;
if(llabs(fz1) == 0 || llabs(fm1)==0)
printf("0\n");
else if(llabs(fz1)%llabs(fm1)==0)
printf("%lld\n",fz1/fm1);
else if(fz1/fm1)
printf("%lld %lld/%lld\n",fz1/fm1,fz1-fz1/fm1*fm1,fm1);
else
printf("%lld/%lld\n",fz1,fm1);
return 0;
}