例如求两个不超过200位的非负整数的和,结果里不能有多余的前导0。
用字符串保存大整数,用整型数组保存结果,注意考虑进位情况
代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,s2;
int a[201];
while(cin>>s1>>s2)//输入两个字符串
{
if(s1.length()>s2.length())//判断字符串长度,并在短串前面补上0,让两串长度相等
{
string s;
for(int i=0;i<s1.length()-s2.length();i++)
s+="0";
s2=s+s2;
}
else
{
string s;
for(int i=0;i<s2.length()-s1.length();i++)
s+="0";
s1=s+s1;
}
a[0]=0;//结果数组的首位初始化0,用于保存最高位的进位
int d=0;//进位初始化为0
for(int i=s2.length();i>=1;i--)//从最低位开始计算两个数各位的和,保存到结果数组
a[i]=s2[i-1]+s1[i-1]-'0'-'0';//a[1]为计算后结果的最高位,进位情况还未处理
for(int i=s2.length();i>=0;i--)//处理进位情况
{
a[i]+=d;//本位加上上一位的进位
if(a[i]>=10)//当该位大于等于10时,只保留该位的个位 ,向下一位的进位d为十位
{
d=a[i]/10;
a[i]%=10;
}
else if(a[i]<10)//当该位小于10是,向高位的进位为0
{
d=0;
}
}
if(a[0]>0)//当最高位大于0时直接输出显示结果数组
{
for(int i=0;i<=s2.length();i++)
cout<<a[i];
cout<<endl;
}
else//最高位等于0时,不显示最高位
{
for(int i=1;i<=s2.length();i++)
cout<<a[i];
cout<<endl;
}
}
return 0;
}