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

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);
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 latex投稿显示click download
    • ¥15 请问读取环境变量文件失败是什么原因?
    • ¥15 在若依框架下实现人脸识别
    • ¥15 网络科学导论,网络控制
    • ¥100 安卓tv程序连接SQLSERVER2008问题
    • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
    • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
    • ¥15 关于arduino编程toCharArray()函数的使用
    • ¥100 vc++混合CEF采用CLR方式编译报错
    • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?