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