标签:使用字符串 直接 图片 ever str 编写 数值 存在 else
问题描述:基本思路:大数加法是使用字符串来存储大数,并逐个按照位数相加;a串和b串可能含有前导0,所以substr()函数和find_first_not_of(‘0‘)函数除去前导0,使用reverse()函数将a串和b串反转以便后面从最低位开始运算,ans串存放的是最终结果,然后从最低位开始将ans串和b串相加,tem是上一位的进位,最终的ans串反转为从高位到低位的顺序.
下面是一个大数加法的模板
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string a,string b)
{
//除去字符串前面的前导0
a=a.substr(a.find_first_not_of(‘0‘));
b=b.substr(b.find_first_not_of(‘0‘));
int lenA = a.length();
int lenB = b.length();
int len = max(lenA,lenB)+10;
//将a串和b串反转,从最低位开始运算
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string ans(len,‘0‘);
//将a串拷贝到ans串
for(int i = 0;i < lenA;++i)
ans[i]=a[i];
//tem是上一位的进位
int tem=0;
for(int i = 0;i < len;i++)
{
if(i<b.length())
tem += (ans[i]-‘0‘)+(b[i]-‘0‘);
else
tem += (ans[i]-‘0‘);
ans[i] = tem % 10 +‘0‘;
tem /= 10;
}
//ans串和b串是从最低位开始运算,所以要将ans串反转从最高位到最低位
reverse(ans.begin(),ans.end());
//前面可能存在多余的前导0,返回之前截掉
return ans.substr(ans.find_first_not_of(‘0‘));
}
int main()
{
string a ="00001234";
string b ="0005678";
cout<<add(a,b)<<endl;
return 0;
}
结果截图:
标签:使用字符串 直接 图片 ever str 编写 数值 存在 else
原文地址:https://blog.51cto.com/14472348/2468109