A - A + B Problem II
Sample Input
2
1 2
112233445566778899 998877665544332211
Sample Output
Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
这道题我本来是不会做的,看了别人的代码慢慢理解才会做的。
考点:简单的大数相加问题
思路:当要表示的数据超出计算机所使用的数据表示范围时,此时就会产生数据的溢出,这就是常见的大数问题。在java中有专门的大数计算方法。但在c c++中处理大数问题比较麻烦。首先大数储存在字符串数组中,用字符串的方式保存大数的每一位。然后将字符型转换为数字型。
注意点:1.字符型转换为数字型 遍历数组对每一位减‘0’得到对应的整数值。
2.存储数字时采用倒序方式存储。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
char str1[100];
char str2[100];
int a[100],b[100],c[100];
int main()
{
int n,cnt=1,m;
cin>>n;
m=n;
while(n--)
{
int u=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>str1>>str2;
int len1=strlen(str1);
int len2=strlen(str2);
for(int i=len1-1,j=0;i>=0;i--,j++)
{
a[j]=str1[i]-'0';
}
for(int i=len2-1,j=0;i>=0;i--,j++)
{
b[j]=str2[i]-'0';
//cout<<b[j];
}
int len3=len1>len2?len1:len2;
for(int i=0;i<=len3;i++)
{
c[i]=a[i]+b[i]+u;
u=c[i]/10;
c[i]=c[i]%10;
cout<<c[i]<<endl;
}
for(int i=len3;i>=0;i--)
if(c[i]!=0)
{
len3=i;
break;
}
printf("Case %d:\n%s + %s = ",cnt++,str1,str2);
for(int i=len3;i>=0;i--)
{
printf("%d",c[i]);
}
printf("\n");
if(cnt<=m)
{
printf("\n");
}
}
return 0;
}
for(int i=0;i<=len3;i++)
{
c[i]=a[i]+b[i]+u;
u=c[i]/10;
c[i]=c[i]%10;
cout<<c[i]<<endl;
}这是代码的关键也是难点,反正我是看了好几遍才想通。u变量是为了进位。c[i]是把每一位相加。
这是运行结果,其实大数相加就是模板题,会用java是最好的。不会用模板思路多写几遍就会了。