月明林下美人来 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 #MATLAB仿真#车辆换道路径规划
    • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
    • ¥15 数据可视化Python
    • ¥15 要给毕业设计添加扫码登录的功能!!有偿
    • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
    • ¥15 微信公众号自制会员卡没有收款渠道啊
    • ¥100 Jenkins自动化部署—悬赏100元
    • ¥15 关于#python#的问题:求帮写python代码
    • ¥20 MATLAB画图图形出现上下震荡的线条
    • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘