vendredi 20 mars 2020

What cases do I miss in SPOJ ARITH problem (WA)?

I've recently started doing some SPOJ Classical problems and I stucked at SPOJ ARITH problem: https://www.spoj.com/problems/ARITH/

I wanted to solve this very fast, so I've written extremely ugly code in C but it's seems to work. Alas, SPOJ Judge is telling me that my code gives wrong answer. I've tried hundreds of tricksy corn cases, including cases with 500-digit numbers but still can't find any problem with my code's output. I would like to kindly ask you if you can read problem description and maybe find some test case which my program can't handle (and why?).

Here is my code: https://ideone.com/fork/CjOIwa

        #include <stdio.h>

int main(void) {
int num1[500];
int num2[500];
int num3[1002];
int l1=0;
int l2=0;
int lm=0;
int cases=0;
int c=0;
int i=0;
int j=0;
int k=0;
int m=0;
int p=0;
int op=0;
int ex1=0;
int ex2=0;
int ex3=0;
int ex4=0;
int var=0;
int r=0;
int rm=0;
int w=0;
scanf("%d", &cases);
getchar();
while(cases>0) {
    i=0;
    ex1=0;
    ex2=0;
    ex3=0;
    ex4=0;
    r=0;
    while((c=getchar())!='*' && c!='+' && c!='-') {
        num1[i]=c-48;
        i++;
    }
    l1=i;
    i=0;
    op=c;
    while((c=getchar())!=EOF && c!='\n') {
        num2[i]=c-48;
        i++;
    }
    l2=i;
    if(l1>l2) lm=l1;
    else lm=l2;
    if(l1>l2) ex2=-1;
    else ex1=1;
    var=lm;
    if(l2>=l1) var++;
    if(op=='+' && l1>l2) {
        i=l1-1;
        j=l2-1;
        while(i>=0 && j>=0) {
            if(num1[i]+num2[j]+r>=10) r=1;
            i--;
            j--;
        }
        while(i>=0) {
            if(num1[i]+r<=9) i=-10;
            i--;
        }
        if(i>-5) ex3=1;
    }
    else if(op=='*' && l1>1 && l2>1) {
        for(j=l1-1; j>=0; j--) r=(num2[0]*num1[j]+r)/10;
        if(r<=0) ex4--;
        ex4=ex4-var+l2+l1;
    }
    for(i=0; i<lm-l1+ex1+ex3+ex4; i++) printf(" ");
    for(i=0; i<l1; i++) printf("%d", num1[i]);
    printf("\n");
    for(i=0; i<lm-l2+ex2+ex3+ex4; i++) printf(" ");
    printf("%c", op);
    for(i=0; i<l2; i++) printf("%d", num2[i]);
    printf("\n");
    for(i=0; i<ex3+ex4; i++) printf(" ");
    for(i=0; i<lm; i++) printf("-");
    if(l2>=l1) printf("-");
    printf("\n");
    if(op=='+') {
        i=1;
        j=0;
        r=0;
        while(l1-i>=0 && l2-i>=0) {
            num3[j]=(num1[l1-i]+num2[l2-i]+r)%10;
            r=(num1[l1-i]+num2[l2-i]+r)/10;
            i++;
            j++;
        }
        while(l1-i>=0) {
            num3[j]=(num1[l1-i]+r)%10;
            r=(num1[l1-i]+r)/10;
            i++;
            j++;
        }
        while(l2-i>=0) {
            num3[j]=(num2[l2-i]+r)%10;
            r=(num2[l2-i]+r)/10;
            i++;
            j++;
        }
        if(r!=0) j++;
        for(i=0; i<var-j; i++) printf(" ");
        if(r!=0) {
            j--;
            printf("%d", r);
        }
        for(i=j-1; i>=0; i--) printf("%d", num3[i]);
        printf("\n");
    }
    else if(op=='-') {
        i=1;
        j=0;
        while(l1-i>=0 && l2-i>=0) {
            if(num1[l1-i]<num2[l2-i]) {
                num1[l1-i]+=10;
                num1[l1-i-1]--;
            }
            num3[j]=num1[l1-i]-num2[l2-i];
            i++;
            j++;
        }
        while(l1-i>=0) {
            if(num1[l1-i]<0) {
                num1[l1-i]+=10;
                num1[l1-i-1]--;
            }
            num3[j]=num1[l1-i];
            i++;
            j++;
        }
        m=l1-1;
        i=l2-1;
        m=-10;
        if(l1==l2) {
            m=0;
            while(m>=0) {
                if(num1[i]!=num2[i]) m=-10;
                m--;
            }
        }
        if(m<=-10) {
            for(i=0; i<var-j; i++) printf(" ");
            for(i=j-1; num3[i]==0; i--) printf(" ");
            while(i>=0) {
                printf("%d", num3[i]);
                i--;
            }
        }
        else {
            for(i=0; i<var-1; i++) printf(" ");
            printf("%d", 0);
        }
        printf("\n");
    }
    else {
        i=1;
        j=0;
        k=1;
        r=0;
        p=1;
        while(l2>1 && l2-i>=0) {
            while(l1-k>=0) {
                num3[j]=(num2[l2-p]*num1[l1-k]+r)%10;
                r=(num2[l2-p]*num1[l1-k]+r)/10;
                k++;
                j++;
            }
            if(r!=0) {
                num3[j]=r;
                j++;
            }
            for(m=0; m<ex4+var-j-p+1; m++) printf(" ");
            for(m=j-1; m>=0 && num3[m]==0; m--);
            if(m==-1) {
                for(k=0; k<j-1; k++) printf(" ");
                printf("%d", 0);
            }
            while(m>=0) {
                printf("%d", num3[m]);
                m--;
            }
            printf("\n");
            r=0;
            k=1;
            j=0;
            i++;
            p++;
        }
        j=0;
        for(m=0; m<1002; m++) num3[m]=0;
        if(l2>1) {
            for(m=0; m<var+ex4; m++) printf("-");
            printf("\n");
        }
        while(l2-j>0) {
            i=0;
            r=0;
            rm=0;
            while(l1-i>0) {
                w=num1[l1-i-1]*num2[l2-j-1]+rm;
                rm=w/10;
                num3[i+j]=num3[i+j]+(w%10)+r;
                r=num3[i+j]/10;
                num3[i+j]%=10;
                i++;
            }
            num3[i+j]+=r+rm;
            r=num3[i+j]/10;
            num3[i+j]%=10;
            num3[i+j+1]=r;
            j++;
        }
        if(num1[0]!=0 && num2[0]!=0) {
            m=l1+l2-1;
            if(num3[l1+l2-1]==0) {
                if(l1+l2-1<var) printf(" ");
                m--;
            }
            while(m>=0) {
                printf("%d", num3[m]);
                m--;
            }
        }
        else {
            for(m=0; m<ex4+var-1; m++) printf(" ");
            printf("%d", 0);
        }
        printf("\n");
    }
    printf("\n");
    cases--;
}
return 0;

}

Aucun commentaire:

Enregistrer un commentaire