超大整数相加,一般来说给的样例都是超过了int型范围,这个时候我们可以用数组或者栈来解答,下面的程序用的便是数组的方法。
#include <iostream>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<cmath>//这里有些头文件可以不用加,因为这些是我试了好几个方法加的,下面只展示一个方法
using namespace std;
int main()
{
string str1;
string str2;
int i,j;
cin >> str1;
cin >> str2;
int h=str1.size();
int k=str2.size();
//这里我想的是对比两个数组的长度,短的那个从头添零,直到两个数组长度一样
if(h>k)
{
char c='0';
str2.insert(0,h-k,c);
//cout<<str2; 整个程序我在很多地方都像这里做了测试,看输出结果是否是我想要的
}
if(k>h)
{
char c='0';
str1.insert(0,k-h,c);
//cout<<str1;
}
int d=str1.size();
int e=str2.size();
//cout<<d<<" "<<e;}
//cout<<h<<" "<<k;}
//到此为止都可以运行
string str3(d+1,'0');
//cout<<str3;}//测试 输入1111 11 输出00000
while (d!=0&&e!=0)//从尾部逐个相加str1和str2 ,只有d,e均为0时停下
{
int a=(int)(str1[d-1]-'0'); //强制转换
int b=(int)(str2[e-1]-'0');
str3[d]=str3[d]+a+b;
//cout<<str3[d];exit(0);}}
if((a+b)>9)
{
str3[d]=str3[d]-10;
str3[d-1]+=1;
//cout<<str3[d]<<" "<<str3[d-1];exit(0);
} //}}
//cout<<str3[d];
d--;
e--;
//cout<<str3[d];
}
//cout<<str3;} //几个样例测试 55 5 060/555 5 0560/111 1 0112
//这里要再次声明d,e,不然它们的值会跟着while中的走
d=str1.size();
e=str2.size();
//逐个输出结果
//int c=(int)(str3[0]-48);//cout<<c;} //c=0 ->测试
if (str3[0]==48)
{
for(i=1;i<=d;i++)
{
cout<<str3[i];
}
}
else
{
for(i=0;i<=d;i++)
{
cout<<str3[i];
}
}
这个程序我觉得主要的难点在进位问题上,解决了这个问题,再注意一下细节,就基本没问题了。