//实现两个大数(字符串)的相加,并返回string类型计算结果
string add(string str_1,string str_2)
{
string result;//保存计算结果,倒序保存
string temp;
bool carryFlag = false;//进位标志,false表述不进位,true表示进位
string maxString = (str_1.size()>=str_2.size())? str_1 : str_2;
string minString = (str_1.size()<str_2.size())? str_1 : str_2;
//将短字符串补齐到和长字符串一样长,在短字符串前边补上字符'0'
int maxLength = maxString.size();
int minLength = minString.size();
temp.append((maxLength - minLength),'0').append(minString);
minString.clear();
minString.append(temp);
//字符串进行倒序遍历,按位相加
for(int i=(maxString.size()-1);i>=0;i--)
{
int res;
if(carryFlag)//有进位,计算结果res加1;无进位不加1。
res = (maxString[i]-48)+(minString[i]-48)+1;//字符'0'在ASCII表中对应十进制数是48
else
res = (maxString[i]-48)+(minString[i]-48);
//判断结算结果res是否产生进位,进位标志carryFlag 的状态也要随之改变
if(res<10)
carryFlag = false;//res无进位
else
carryFlag = true;//res有进位
result.push_back((res%10)+48);//将res取10的余数转换为字符保存
}
//循环结束后,最后还需要判断一次进位标志,判断两个字符串最后一次相加是否产生进位
if(carryFlag)
result.push_back(49);//计算结果是倒序保存,所以在最后添加字符'1'
reverse(result.begin(),result.end());//将计算结果逆置就是实际计算结果
return result;
}