月明林下美人来 2019-11-07 16:00 采纳率: 0%
浏览 281

PAT乙级1034,codeblocks上运行正确,但提交答案错误

我写了一段比较长的代码,在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);
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 19:54
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码在 CodeBlocks 上运行正常,但在提交到服务器时出现 "Answer Error" 的问题。这可能是因为你的程序中存在逻辑错误或语法错误。

    首先,请确保你的程序已经编译成功,并且所有的函数都按照预期工作。其次,检查 toform 函数是否能够正确地将分数转换成标准形式。如果它不能正确处理所有的情况,那么你需要调整这个函数以适应更多的边界条件。

    此外,检查 check 函数,看看是否有任何边缘情况没有被考虑。例如,对于分数 -1.5, 如果你想将其转换为标准形式,你需要考虑 -1.5-0.5 是否应该被视为同一种形式。同样,检查 add, sub, mul, divv 函数,看它们是否能处理所有可能的情况。

    最后,确保你使用了正确的注释,以便于其他人理解你的代码。如果你的代码包含大量复杂的逻辑,使用有意义的变量名和函数名称可以帮助别人更好地理解和维护你的代码。

    总之,要解决这个问题,你需要仔细检查并修复你的代码中的逻辑错误和语法错误。希望我的回答对你有所帮助!

    评论

报告相同问题?