首先讲一下大数相加其实代码模拟的过程就是模拟小学的加法法则。因为C语音的LL double等太少不能求位数过多的加减法。
下面让我们一起分析一下代码
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 vector<int> add(vector<int> &A,vector<int> &B) 6 { 7 vector<int>res; 8 int t=0;//t代表是否进位 9 for(int i=0;i<A.size()||i<B.size();i++) 10 { 11 if(i<A.size())t+=A[i]; 12 if(i<B.size())t+=B[i]; 13 res.push_back(t%10); 14 t=t/10; 15 } 16 if(t) res.push_back(1);//这里需要明白如果两个数相加最后一位还是进位了需要输出他 17 return res; 18 } 19 int main() 20 { 21 string a,b; 22 cin>>a>>b; 23 vector<int>A,B; 24 for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-‘0‘);//逆序存入 25 for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-‘0‘); 26 auto C=add(A,B);//auto 会优先匹配C是什么类型 27 for(int i=C.size()-1;i>=0;i--) cout<<C[i]; 倒叙输出 28 return 0; 29 }
然后我们再讲一下大数相减。同样模拟的是小学的运算法则。
#include<iostream> #include<vector> using namespace std; bool cmp(vector<int>&A,vector<int>&B)//比较函数 { if(A.size()!=B.size())return A.size()>B.size();位数不同贼输出较长的那个数组 else{ for(int i=A.size()-1;i>=0;i--)//位数相同则输出先比较大的那个数 { if(A[i]!=B[i])return A[i]>B[i]; } } return true; 如果前面都没输出说明两个数相同,那么谁减谁都一样 } vector<int> sub(vector<int>&A,vector<int>&B) { vector<int>res; for(int i=0,t=0;i<A.size();i++)//这里的t同样代表进位C=A-B-t; { t=A[i]-t; //此处模拟的就是减法的运算法则 if(i<B.size())t=t-B[i]; res.push_back((t+10)%10); if(t<0)t=1; else t=0; } while(res.size()>1&&res.back()==0)res.pop_back(); return res; } int main() { string a,b; cin>>a>>b; vector<int>A,B,C; for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-‘0‘);//逆序存入 for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-‘0‘); if(cmp(A,B))//这里需要比较A和B的大小,如果A大那么就正常减 { C=sub(A,B); for(int i=C.size()-1;i>=0;i--) cout<<C[i]; } else{ C=sub(B,A);//如果B大那么就要先输出一个-号,改成B-A就行 A-B=-(B-A)就是这个道理 cout<<"-"<<endl; for(int i=C.size()-1;i>=0;i--) cout<<C[i]; } return 0; }