这题有多组输入。
高精度用列竖式的方法做即可。
可以用2个字符串来得到A,B,再逆序赋值到2个整形数组当中。
最后再用一个整形数组来保存结果(当然也可以保存在之前那2个整形数组中的一个)
我写的时候遇到了一个困难,顺便涨了涨知识(敲黑板)
如图所示,若数组作为形参传递到函数中,sizeof得到的永远都是8(即指针所占据的空间)(不过是字符串类型的还是整形类型的数组都会这样)
原因:
形参是实参的一份拷贝,是局部变量。但是数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,
数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。
解决方案:
加上数组引用,再使用模板让参数变为完整的类型。
int数组的解决方案为
字符串的解决方案为(即把template中的int模板改成char即可……)
接下来就是AC代码(与前面的小细节相比感觉不值一提):
#include<cstdio> #include<algorithm> #include<vector> #include<cstring> #define MAXN 6666 using namespace std; typedef long long ll; char s1[MAXN],s2[MAXN]; int a[MAXN],b[MAXN],c[MAXN]; template<int len> void dh(char s[],int (&a)[len]){//将字符串数组逆序存储到整形数组当中 memset(a, 0, 4*MAXN); a[0]=strlen(s); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-‘0‘; } void Add(int a[],int b[],int c[]){//高精加 两个正整数 令a+b=c; int n=max(a[0],b[0]); int temp=0; for(int i=1;i<=n;i++){ c[i] = (a[i]+b[i]+temp)%10; temp=(a[i]+b[i]+temp)/10; } if(temp) c[n+1]=temp; if(temp>0) c[0] = n+1; else c[0] =n; } int main(){ int t,id=0; scanf("%d",&t); while(t--){ scanf("%s%s",&s1,&s2); dh(s1,a); dh(s2,b); Add(a,b,c); printf("Case %d:\n",++id); printf("%s + %s = ",s1,s2); for(int i=c[0];i>=1;i--) printf("%d",c[i]); printf("\n"); if(t) printf("\n"); } }
A + B Problem II HDU - 1002(高精加)(有一个超级重要的小细节※)
原文:https://www.cnblogs.com/mikku39/p/14426847.html