题目1198:a+b-----没有AC掉,,,,,借鉴了别人的一份,还有carr&&(c[len] = carr)&&(++len);是什么意思?
WA:在屏幕上可以出现正确的结果,不知为何不能AC
#include<stdio.h> #include<stdlib.h> #include<cstring> int main() { char str1[1001],str2[1001]; while(scanf("%s %s",str1,str2)!=EOF) { int a[1001],a1=0,b[1001],b1=0,c[1001],c1=0; int i,j; for (i=0;str1[i]!='\0';i++) a[a1++]=str1[i]-'0'; a[a1]='\0'; for(j=0;str2[j]!='\0';j++) b[b1++]=str2[j]-'0'; b[b1]='\0'; int t=0;//代表进位 for (i=a1-1,j=b1-1;i>=0&&j>=0;i--,j--) { c[c1++]=(a[i]+b[j]+t)%10; t=(a[i]+b[j]+t)/10; } int p; if (i>=0) //证明a数组有剩余 { p=t; for (i=i;i>=0;i--) { c[c1++]=(a[i]+p)%10; p=(a[i]+p)/10; } } if (j>=0) //证明b数组有剩余 { p=t; for (j=j;j>=0;j--) { c[c1++]=(b[j]+p)%10; p=(b[j]+p)/10; } } c[c1++]=p; c[c1]='\0'; int k=c1-1; while(c[k]==0) k--; for (k=k;k>=0;k--) printf("%d",c[k]); printf("\n"); } return 0; }
大神的AC代码:
/* 时间:2014.1.16.22.00 目的:大数求和 */ #include <stdio.h> #include <string.h> char a[1001],b[1001]; int c[1001]; int main() { int carr,len_a,len_b,i,j,temp,len; while(~scanf("%s %s", a, b)) { carr = len =0; len_a = strlen(a); len_b = strlen(b); for(i = len_a - 1,j = len_b - 1;i >= 0 && j >= 0;i--, --j) { temp = a[i] - '0' + b[j] - '0' + carr; c[len] = temp % 10; carr = temp / 10; len++; } while(i >= 0) { temp = carr + a[i] - '0'; c[len] = temp % 10; carr = temp / 10; i--; len++; } // carr&&(c[len] = carr)&&(++len);此处我重复了一次 导致WA 因为当输出8 4 时 输出为112,多输出了一个1 while(j >= 0) { temp = carr + b[j] - '0'; c[len] = temp % 10; carr = temp / 10; j--; len++; } carr&&(c[len] = carr)&&(++len);//这到底是什么什么意思??????? for(--len;len>=0;--len) printf("%d", c[len]); printf("\n"); } return 0; } /* 输出结果: --------------------- 2 6 思路: 1.由于数很大,必须用字符串存取 8 2.注意a,b串是从大高位到低位存储,故数字的最低位在串的最高位 10000000000000000000 100000000000000000000000000000003.c串的输出时高位到低位的输出 10000000000010000000000000000000 --------------------- */