#include<stdio.h> #include<string.h> #define size 1001 int main() { char str1[size],str2[size],*num1,*num2,*p1,*p2; int ncase/*多组输入数目*/,mcase=1/*输出时的第几个输出计数器*/,up/*进位存储器*/,len1,len2,len; scanf("%d",&ncase); while(ncase--) { scanf("%s %s",str1,str2); printf("case %d:\n",mcase++); printf("%s + %s = ",str1,str2); len1=strlen(str1);/*分别计算两数长度*/ len2=strlen(str2); if( len1 >= len2 )/*把num1赋较大数的数组首地址num2赋较小数的数组首地址,且保证len1存长数组长度len2存短数组长度*/ { num1=str1; num2=str2; } else { num1=str2; num2=str1; len=len1; len1=len2; len2=len; } up=0;/*进位赋初值0*/ for(p1=num1+len1-1,p2=num2+len2-1;p1>=num1;p1--,p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/ { if( p2 < num2 )/*当高位无数时补0*/ *p2=48; *p1=*p1+*p2-96+up;/*由ascII码值化为十进制值*/ up=0; if( *p1 >= 10 )/*如果此位相加结果十进制值大于10则作减10处理*/ { *p1-=10; up=1;/*进位寄存器赋1*/ } *p1+=48;/*再次化为ascII码以供输出*/ } if( up == 1 )/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/ printf("1"); printf("%s\n",num1);/*输出经加法处理改动的大数组*/ if( ncase != 0 ) printf("\n"); } return 0; } |
|
40分 |
修改如下:
#include<stdio.h> #include<string.h> #define size 1001 int main() { char str1[size], str2[size], *num1, *num2, *p1, *p2; int ncase/*多组输入数目*/, mcase = 1/*输出时的第几个输出计数器*/, up/*进位存储器*/, len1, len2, len; scanf("%d", &ncase); while (ncase--) { scanf("%s %s", str1, str2); printf("case %d:\n", mcase++); printf("%s + %s = ", str1, str2); len1 = strlen(str1);/*分别计算两数长度*/ len2 = strlen(str2); if (len1 >= len2)/*把num1赋较大数的数组首地址num2赋较小数的数组首地址,且保证len1存长数组长度len2存短数组长度*/ { num1 = str1; num2 = str2; } else { num1 = str2; num2 = str1; len = len1; len1 = len2; len2 = len; } up = 0;/*进位赋初值0*/ //for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p1 >= num1; p1--, p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/ for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p2 >= num2; p1--, p2--)/*从各自最小位逐位相加,以较大数的最高位为边界*/ { //if (p2 < num2)/*当高位无数时补0*/ // *p2 = 48; *p1 = *p1 + *p2 - 96 + up;/*由ascII码值化为十进制值*/ up = 0; if (*p1 >= 10)/*如果此位相加结果十进制值大于10则作减10处理*/ { *p1 -= 10; up = 1;/*进位寄存器赋1*/ } *p1 += 48;/*再次化为ascII码以供输出*/ } if (up == 1)/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/ //printf("1"); { while (p1 >= num1) { *p1 += 1; if (*p1 > ""9"") { *p1 = ""0""; up = 1; p1--; } else break; //无进位,直接跳出 } if (p1 < num1) printf("1"); } printf("%s\n", num1);/*输出经加法处理改动的大数组*/ if (ncase != 0) printf("\n"); } return 0; } |
可是我的并没有什么不对啊
|
|
楼主的代码中,随着p2不断减少,极有可能越过最小边界。
试一下,测试用例 999999999999999 + 9 |
|
然而事实证明我的16位的9加 上9结果还是对的 -_-||…
|
|
仅供参考:
#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) { scanf("%d",&n); for (j=0;j<n;j++) { scanf("%s%s",a1,a2); L=strlen(a1); for (i=0;i<L;i++) v1[i]=a1[L-1-i]-""0""; L=strlen(a2); for (i=0;i<L;i++) v2[i]=a2[L-1-i]-""0""; for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i]; for (i=0;i<MAXLEN;i++) { if (v3[i]>=10) { v3[i+1]+=v3[i]/10; v3[i]=v3[i]%10; } } printf("Case %d:\n", j+1); printf("%s + %s = ", a1, a2); z=0; for (i=MAXLEN-1;i>=0;i--) { if (z==0) { if (v3[i]!=0) { printf("%d",v3[i]); z=1; } } else { printf("%d",v3[i]); } } if (z==0) printf("0"); printf("\n"); } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110 |