首先講一下大數相加其實代碼模擬的過程就是模擬小學的加法法則。因為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; }