
链接:1002,记得输出的Case C要大写,我因为没有大写,一直通不过,一度怀疑自己,难道我连第三题都写不出吗(实际上我第二题就是抄别人的,所以第三题我发誓不看别人的了),oj不像pta告诉你哪里错了,对我这种粗心的人很不友好,好了,言归正传。
先说一下我的思路吧,这道题需要处理无限大数的加法(如果是python就好了),首先就要考虑无限大数怎么存,c语言提供的普通类型当然都不行,最大的double类型好像能到10的308次方,可惜精度不足也不够大,其实无限大的数是可以存在内存里的(只要内存够),在裸机上是可行的,可惜操作系统和c语言限制了我的发挥,其实我第一个想到的方法就是这个,用一个struct,用位字段的方法,在里面放足够多的uint64_t,可惜printf无法打印自创的数据类型。
所以限制我们发挥的实际上是printf,printf只有%s的打印不会限制,于是我们只好把数存在字符数组里面,人为的做加法,处理进位,再用%s打印出来,c语言代码如下
# include <stdio.h> # include <string.h> //人工实现加法,m存贮进位值 char *sum2(int a[],int b[],int k,int j){ static char c[1001]; static char d[1001]; int m=0; memset(c,0,1001); memset(d,0,1001); for (;k>=0;k--,j--){ if (j < 0) {c[k+1] = (a[k] + m)%10 + '0' ; m = (a[k]+m)>=10?(a[k]+m)/10:0;} else {c[k+1] = (a[k]+b[j]+m)%10+ '0' ;m = (a[k]+b[j]+m)>=10?(a[k]+b[j]+m)/10:0;} if (m==0){ //这里写的比较差 int i; for (i=0;c[i+1]!= '\0' ;i++) d[i] = c[i+1]; return d; } else if (m>0){ c[0] = m+ '0' ; return c;} }} //传给sum2纯数字,并确定哪个数位数更多简化后续的加法 char *sumbig(char a[],char b[]){ int i,j; int x[1001],z[1001]; for (i = 0;a[i]!= '\0' ;i++) x[i] = a[i] - '0' ; for (j = 0;b[j]!= '\0' ;j++) z[j] = b[j] - '0' ; if (i >= j) return sum2(x,z,i-1,j-1); else return sum2(z,x,j-1,i-1); } int main(){ int n; char a[1001],b[1001]; scanf("%d",&n); for (int i = 1;i <= n;i++){ scanf("%s %s",a,b); printf("Case %d:\n",i); printf("%s + %s = %s\n\n",a,b,sumbig(a,b)); } return 0; } |