又是一道错误的答案题,明明测试数据都过了。。。。。。。。。
这是农大oj上的题目,目的是求分式的运算,如 6/7 + 5/4 可以是加减乘除,网址是http://acm.fafu.请高手帮我看看我这程序哪里有错误,测试数据有点大,所以我定义的类型都是__int64的#include<stdio.h>
#include<string.h>
struct p//这是定义数的结构体
{
__int64 fm , fz ;//fm是分母,fz是分子
}number[2],end ;
int gcd(__int64 a , __int64 b)//求最大公约数
{
__int64 r,t;
if(a<b)
{
t=a;
a=b;
b=t;
}
do
{
r=a%b;
a=b;
b=r;
}while(r!=0);
return a ;
}
int main()
{
__int64 n ,t,t1 , t2 ,gcr;
scanf("%I64d",&n) ;
char a[4] ;
while(n--)
{
scanf("%I64d/%I64d %c %I64d/%I64d",&number[1].fz,&number[1].fm,&a[2],&number[2].fz,&number[2].fm) ;//输入表达式
if(a[2]=='*')//两个数是乘的情况
{
end.fm=number[1].fm*number[2].fm ;
end.fz=number[1].fz*number[2].fz ;
if(end.fm!=0 && end.fz!=0)//讨论不为0的情况,为0的另外讨论
{
t=gcd(end.fm,end.fz) ;
end.fm/=t ;
end.fz/=t ;
}
}
else if(a[2]=='/')//除的情况
{
end.fm=number[1].fm*number[2].fz ;
end.fz=number[1].fz*number[2].fm ;
if(end.fm!=0 && end.fz!=0)
{
t=gcd(end.fm,end.fz) ;
end.fm/=t ;
end.fz/=t ;
}
}
else //加和减的一起讨论
{
if(number[1].fm!=0 && number[2].fm!=0)
{
t=gcd(number[1].fm,number[2].fm) ;
gcr = number[1].fm * number[2].fm / t ;//求最大公倍数
t1 = gcr / number[1].fm ;
t2 = gcr / number[2].fm ;//通分
number[1].fz *= t1 ;
number[2].fz *= t2 ;
if(a[2]=='+')
end.fz=number[1].fz+number[2].fz ;
else if(a[2]=='-')
end.fz=number[1].fz-number[2].fz ;
end.fm=number[1].fm*t1 ;
if(end.fz!=0)
{
t=gcd(end.fm,end.fz) ;
end.fm/=t ;
end.fz/=t ;
}
}
}
if(end.fm==0)//这里开始是输出,分别讨论分子分母各为0的情况
printf("INF\n") ;
else if(end.fz==0)
{
end.fm=1 ;
printf("%I64d/%I64d\n",end.fz,end.fm) ;
}
else if(end.fm<0)//把负号提前,题目的要求是这样
{
end.fm*=-1 ;
end.fz*=-1 ;
printf("%I64d/%I64d\n",end.fz,end.fm) ;
}
else
printf("%I64d/%I64d\n",end.fz,end.fm) ;
}
return 0 ;
}
[ 本帖最后由 b465513006 于 2011-8-8 19:03 编辑 ]