链接: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; }