C++高精度加法
#include <string>
#include <iostream>
#include<algorithm>
#define ll long long
using namespace std;
string add(string a,string b){//大数的加法
a=a.substr(a.find_first_not_of('0')); //去掉字符串开始的0
b=b.substr(b.find_first_not_of('0'));
ll lenA=a.length();
ll lenB=b.length();
ll len=max(lenA,lenB)+10;
//翻转便于求和
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string ans(len,'0'); //初始化ans为0
//将a拷贝到ans中
for(int i=0;i<lenA;++i){
ans[i]=a[i];
}
int tmp=0;//用来进位0<=tmp<=18
for(int i=0;i<len;++i){
if(i<b.length()) tmp+=(ans[i]-'0')+(b[i]-'0'); //判断a,b的长度
else tmp+=(ans[i]-'0');
ans[i]=tmp%10+'0';
tmp/=10;//假设位18保留1
}
reverse(ans.begin(),ans.end());//结果反转
return ans.substr(ans.find_first_not_of('0'));
}
int main(){
string a="1";
string b="9876543210";
cout<<add(a,b)<<endl;
return 0;
}
思想
- 用字符串来实现C++高精度加法
- 因为是从后往前加,先将两个字符串反转,去掉字符串前面的0,防止出错
a=a.substr(a.find_first_not_of('0')); //去掉字符串开始的0
b=b.substr(b.find_first_not_of('0'));
//翻转便于求和
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
- 求2个字符串最大长度,在加10用于防止答案字符串溢出
ll lenA=a.length();
ll lenB=b.length();
ll len=max(lenA,lenB)+10;
- 初始化答案字符串,并将a字符串复制到ans字符串中
string ans(len,'0'); //初始化ans为0
//将a拷贝到ans中
for(int i=0;i<lenA;++i){
ans[i]=a[i];
}
5.计算过程:遇十进一,并用tmp变量进行进制处理
int tmp=0;//用来进位0<=tmp<=18
for(int i=0;i<len;++i){
if(i<b.length()) tmp+=(ans[i]-'0')+(b[i]-'0'); //判断a,b的长度
else tmp+=(ans[i]-'0');
ans[i]=tmp%10+'0';
tmp/=10;//假设位18保留1
}
6.结果:将ans字符串反转,并去掉最前面连续的0
reverse(ans.begin(),ans.end());//结果反转
return ans.substr(ans.find_first_not_of('0'));