我写了一段比较长的代码,在codeblocks运行显示的答案和输出样例的答案是一样的,但提交后显示答案错误,没有超时,求大神解释!(虽然思路比较繁琐,但结构尚且清晰……)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long gcd(long a,long b);
void toform(long * num, long a, long b);//该函数把分数变为输出的标准形式,放在long数组里面,
//即整数部分和最简分数部分,一共三个值
int check(long * input);//根据标准形式决定用哪种格式输出--二维数组forms中的八种情况
long * add(long a, long b, long c, long d, long *temp);//加法,返回结果的标准形式
long * sub(long a, long b, long c, long d, long *temp);//减法
long * mul(long a, long b, long c, long d, long *temp);//乘法
long * divv(long a, long b, long c, long d, long *temp);//除法
void PRINT(int mark, long * input, char forms[][20]);//输出函数
int main()
{
long inputa[5],inputb[5];
int marka=-1, markb=-1,markr=-1;//该标志位决定用哪种格式输出
long a,b,c,d;
char forms[8][20]={"(-%ld %ld/%ld)","(-%ld)","(-%ld/%ld)",
"%ld %ld/%ld","%ld/%ld","0","%ld","Inf"};//存放输出的八种格式,通过
//marka,markb,markr的值来访问
long result[5];
long * arrayin[3];
arrayin[0]=inputa;
arrayin[1]=inputb;
arrayin[2]=result;
scanf("%ld/%ld %ld/%ld",&a,&b,&c,&d);
toform(inputa,a,b);
toform(inputb,c,d);
marka=check(inputa);//分别设置输入的两个有理数的输出格式
markb=check(inputb);
markr=check(add(a,b,c,d,result));//加法输出
PRINT(marka,inputa,forms);
printf(" + ");
PRINT(markb,inputb,forms);
printf(" = ");
PRINT(markr,result,forms);
printf("\n");
markr=check(sub(a,b,c,d,result));//减法输出
PRINT(marka,inputa,forms);
printf(" - ");
PRINT(markb,inputb,forms);
printf(" = ");
PRINT(markr,result,forms);
printf("\n");
markr=check(mul(a,b,c,d,result));//乘法输出
PRINT(marka,inputa,forms);
printf(" * ");
PRINT(markb,inputb,forms);
printf(" = ");
PRINT(markr,result,forms);
printf("\n");
markr=check(divv(a,b,c,d,result));//除法输出
PRINT(marka,inputa,forms);
printf(" / ");
PRINT(markb,inputb,forms);
printf(" = ");
PRINT(markr,result,forms);
return 0;
}
void toform(long * num, long a, long b)
{
long ys;
ys=gcd((long)abs(a%b),(long)abs(b));//求最大公约数
num[0]=a/b;
num[1]=(a%b)/ys;
num[2]=b/ys;
}
int check(long * input)//决定哪种格式输出,返回值作为访问forms的下标
{
if(input[4]){
if(input[0]<0)
{
if(input[1]==0)
return 1;
else
return 0;
}
else if(input[0]>0)
{
if(input[1]==0)
return 6;
else
return 3;
}
else
{
if(input[1]>0)
return 4;
else if(input[1]<0)
return 2;
else
return 5;
}
}
else
return 7;
}
long * add(long a,long b,long c,long d, long *temp)
{
long num1,num2;
num1=a*d+b*c;
num2=b*d;
toform(temp,num1,num2);
temp[4]=1;//除数是否为零标志位,每次输出时检测,若为0,直接输出"Inf",
return temp;
}
long * sub(long a,long b,long c,long d, long *temp)
{
long num1,num2;
num1=a*d-b*c;
num2=b*d;
toform(temp,num1,num2);
temp[4]=1;//除数是否为零标志位,每次输出时检测,若为0,直接输出"Inf",
return temp;
}
long * mul(long a,long b,long c,long d, long *temp)
{
long num1,num2;
num1=a*c;
num2=b*d;
toform(temp,num1,num2);
temp[4]=1;//除数是否为零标志位,每次输出时检测,若为0,直接输出"Inf",
return temp;
}
long * divv(long a,long b,long c,long d, long *temp)
{
long num1,num2;
if(c==0)
{
temp[4]=0;
return temp;
}
else
{
if(c<0)//计算除法要把除数倒过来,而只能是分子是负数,所以要把分子、分母换一下号
{
c=-c;
d=-d;
}
num1=a*d;
num2=b*c;
toform(temp,num1,num2);
temp[4]=1;//除数是否为零标志位,每次输出时检测,若为0,直接输出"Inf",
}
return temp;
}
void PRINT(int mark, long * input, char forms[][20])
{
switch(mark)
{
case 0: printf(forms[0],(long)abs(input[0]),(long)abs(input[1]),(long)abs(input[2])); break;
case 1: printf(forms[1],(long)abs(input[0])); break;
case 2: printf(forms[2],(long)abs(input[1]),(long)abs(input[2])); break;
case 3: printf(forms[3],(long)abs(input[0]),(long)abs(input[1]),(long)abs(input[2])); break;
case 4: printf(forms[4],(long)abs(input[1]),(long)abs(input[2])); break;
case 5: printf(forms[5]); break;
case 6: printf(forms[6],(long)abs(input[0])); break;
case 7: printf(forms[7]); break;
}
}
long gcd(long a,long b)//求最大公约数
{
if(a%b==0)
return b;
else;
return gcd(b,a%b);
}