由于存储数据有限,对于大数据没有办法直接存储,所以选择使用数组进行存储与计算较大的数据。此处使用的vector容器。
1.数据的输入与存储
我们选择用string进行数据的输入存储,vector进行存储计算,例如计算11+23;如下图:
string s,t;
cin>>s>>t;
创建了两个string 类变量 s和t,分别将11和23输入到s和t中。
下一步就是利用s.size()和t.size()计算长度,然后将其存储到vector中
string s,t; cin>>s>>t; vector<int> a,b; for(int i=s.size()-1;i>=0;i--) a.push_back(s[i]-'0'); for(int i=t.size()-1;i>=0;i--) b.push_back(t[i]-'0');
注意:
- 这里string存的是char类型的'0' '1'等(ascll码),所以在push_back输入时,要减去'0'。
- 为什么要从s.size()-1开始循环?因为这样循环可以将数据按照个位、十位、百位的顺序存到vector中,方便后续的相加运算。例如23,存的时候我们就可以存成3 2。
2.数据的相加
auto c=add(a,b);
1.利用auto,让其帮助我们判断变量c的数据类型。
2.调用我们自己写的add函数进行相加操作,传进去的参数是两个vector,a和b。
再来看add函数的部分
vector<int> add(vector<int>&A,vector<int>&B) //开头我们利用引用,给传进来的参数起了个别名,这样不用浪费空间在复制两个vector { vector<int> c; int t=0; //t用来进行每一位的相加。例如11+23中个位1+3=4,存到t中,再次循环,十位1+2=3,存到t中。 for(int i=0;i<A.size()||i<B.size();i++) { if(i<A.size())t+=A[i]; if(i<B.size())t+=B[i]; c.push_back(t%10); t/=10; } if(t)c.push_back(1); while(c.size()>1&&c.back()==0) c.pop_back(); return c; }
- 判断条件为什么是i<A.size() || i<B.size() ? 假如,当我们计算110+23时,两个容器长度就会不同,由于我们是按位数计算,我们要确保每一位都能被加上。这时就衔接到下方的if语句。当分别算完t=0+3,t=1+2时,110中还剩百位的1没有处理。使用这样的循环判断条件,就能让我们继续对剩下的数据进行处理。
- 像c中输入数据为什么要t%10,当我们计算例如9+7这样的数时,t=16;此时我们进行t%10,这样就只把6存到了vector中。
- 再进行t/=10,将16末尾的6删去,使得t=1,在下次循环中,将其作为进位的1进行相加。
- if(t)c.push_back的作用是什么? 我们知道,两个 个位数相加它的和一定不会超过20,当我们算到最后时,如果仍需要向前进一位,那肯定是进一位1。就像99+11,算到最后,t=9+1+1=11,t%10将1输入到vector中,再进行t/=10,t=1。这时就需要向前进位,进1。
- 下方while语句的作用,去除前导0。
- 最后返回这个vector c
3.计算后结果的输出
string s,t; cin>>s>>t; vector<int> a,b; for(int i=s.size()-1;i>=0;i--) a.push_back(s[i]-'0'); for(int i=t.size()-1;i>=0;i--) b.push_back(t[i]-'0'); auto c=add(a,b); for(int i=c.size()-1;i>=0;i--) cout<<c[i];
输出也是倒着从容器末尾开始输出,例如计算11+23后结果为 3 4,但在c中存储为 4 3,所以从其末尾输出。
4.全部代码
#include <iostream> #include <vector> using namespace std; vector<int> add(vector<int>&A,vector<int>&B) { vector<int> c; int t=0; for(int i=0;i<A.size()||i<B.size();i++) { if(i<A.size())t+=A[i]; if(i<B.size())t+=B[i]; c.push_back(t%10); t/=10; } if(t)c.push_back(1); while(c.size()>1&&c.back()==0) c.pop_back(); return c; } int main() { string s,t; cin>>s>>t; vector<int> a,b; for(int i=s.size()-1;i>=0;i--) a.push_back(s[i]-'0'); for(int i=t.size()-1;i>=0;i--) b.push_back(t[i]-'0'); auto c=add(a,b); for(int i=c.size()-1;i>=0;i--) cout<<c[i]; return 0; }
2022/11/10 21:26