大数相加,通常题目会给你超出1000位的数字,此时早已经远超long long的范围了,我们自然不能用常规方法了,此时我们自然而然想到利用字符串去存取数字,而其中的计算我们应该注意哪些问题呢? 1、两个数是不是一样长。是就可以直接计算,不是,我们要让它变成一样长,方便我们对齐计算,那么我们首先要知道哪个需要去补,所以我们应该找出短的那个数,在其前面补0
if(str1.size()<str2.size())//让str1的长度始终最长 { string temp=str1; str1=str2; str2=temp; } int len=str1.size()-str2.size(); string str3(len,'0');//前面补0 str2=str3+str2; 2、进位问题。我们可以利用一个额外的a来保存进位,看是否需要进位 ```cpp int a=0; for(int i=str1.size()-1;i>=0;i--) { int b=(str1[i]-'0')+(str2[i]-'0')+a; if(b>9) { strsum.push_back((b-10)+'0'); a=1; } else { strsum.push_back(b+'0'); a=0; } }3、首位还未进行进位,我们给他一个判断,然后输出
if(a) strsum.push_back(a+'0'); for (string::reverse_iterator j = strsum.rbegin(); j != strsum.rend(); ++j) //新字符串逆序输出。 cout << *j;上所有代码
#include<bits/stdc++.h> using namespace std; const int MAX=10001; //大数相加 int main() { string str1,str2,strsum; cin>>str1>>str2; if(str1.size()<str2.size()) { string temp=str1; str1=str2; str2=temp; } int len=str1.size()-str2.size(); string str3(len,'0'); str2=str3+str2; int a=0; for(int i=str1.size()-1;i>=0;i--) { int b=(str1[i]-'0')+(str2[i]-'0')+a; if(b>9) { strsum.push_back((b-10)+'0'); a=1; } else { strsum.push_back(b+'0'); a=0; } } if(a) strsum.push_back(a+'0'); for (string::reverse_iterator j = strsum.rbegin(); j != strsum.rend(); ++j) //新字符串逆序输出。 cout << *j; }