大整数指的是无法使用语言固有类型变量去存储的整数,但是我们在一些问题的解决上还需要这样的大整数运算(加法最为常见),在正常情况下必然造成数据的溢出,那么我们到底应该如何去解决这样的问题呢?其实也很简单,我们可以把一个大整数看成一个字符串,让它们一位一位相加,而且处理进位也非常方便。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int N;
cin>>N;
int num1[1000],num2[1000],sum[1000]; //num1和num2储存由字符串转换而来的大整数的每一位
char str1[1000],str2[1000]; //str1和str2储存大整数字符串
int len1,len2;
for(int i=1;i<=N;i++)
{
memset(num1,0,sizeof(num1)); //将所有数组元素置0,以便处理进位相加
memset(num2,0,sizeof(num2));
memset(sum,0,sizeof(sum));
cin>>str1;
cin>>str2;
len1=strlen(str1);
len2=strlen(str2);
int max=len1>len2?len1:len2;
int j=0;
for(int k=len1-1;k>=0;k--)num1[j++]=str1[k]-'0'; //将大整数串转换成数字,注意是逆置
j=0;
for(int k=len2-1;k>=0;k--)num2[j++]=str2[k]-'0';
int p=0; //p为进位信号,为0时没有,为1时有
for(int k=0;k<=max;k++) //把两个转换后的大整数一位一位相加
{
sum[k]=num2[k]+num1[k]+p;
if(sum[k]>=10) //当第k位的数字大于等于10时说明要产生进位
{
sum[k]-=10;
p=1;
}
else p=0;
}
cout<<"Case "<<i<<":"<<endl;
for(int k=len1-1;k>=0;k--)cout<<num1[k]; //输出所有大整数
cout<<" + ";
for(int k=len2-1;k>=0;k--)cout<<num2[k];
cout<<" = ";
if(sum[max])cout<<sum[max];
for(int k=max-1;k>=0;k--)cout<<sum[k];
cout<<endl;
if(i!=N) cout<<endl;
}
return 0;
}
这段代码是去刷题的时候写的,是A过的。核心就是把一个大整数分成一位一位相加,关键就是处理进位的问题(在上面代码的注释中写的那部分)。