解決方法 :咱們能夠把一個很大的數當作字符串進行處理,這時候就須要用到高精度。
PK一下ios
#include <vector> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main(void) { vector<int> add(vector<int> &A,vector<int> &B); // Vector容器至關因而一個數組,比數組處理起來更加方便 (返回一個 vector 類型的值) vector<int>A,B,C; string a,b; cin >> a >> b; // 輸入兩個大數 for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0'); // 咱們進行加法的時候要從低位開始,字符串輸入的時候低位在最後,因此咱們要將字符串逆序存儲在容器中 for(int i = b.length() - 1; ~i; i --) B.push_back(b[i] - '0'); C = add(A,B); for(int i = C.size() - 1; ~i; i --) cout << C[i]; // 同理,輸出的時候也要逆序輸出 return 0; } vector<int> add(vector<int> &A,vector<int> &B) { if(A.size() < B.size()) return add(B,A); // 儘可能用長的 + 短的,由於這樣多餘的部分咱們就能夠直接進行處理了 vector<int> C; // 設置一個 vector 類型的變量,用來做爲返回的值 int t = 0; for(int i = 0; i < A.size(); i ++) { t += A[i]; if(B.size() > i) t += B[i]; // B 有必定的限制,不能一直加 呀 C.push_back(t % 10); t /= 10; // 進位 } if(t) C.push_back(t); // 可能會多出來一個,例如3位數 + 3 位數 ,結果有多是 4 位數 return C; }
注意 : 一、答案有多是負數 二、最後存儲在 vector 中的字符串可能會存在前導 0
PK一下數組
#include <vector> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main(void) { void ClearZero(vector<int> &A); // Clear 前導 0 bool cmp(vector<int> &A,vector<int> &B); // 比較兩個字符串,讓 大的減去 小的 vector<int> sub(vector<int> &A,vector<int> &B); vector<int>A,B,C; string a,b; cin >> a >> b; for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0'); for(int i = b.length() - 1; ~i; i --) B.push_back(b[i] - '0'); ClearZero(A),ClearZero(B); // 先去除字符串計算自己的的前導 0 if(cmp(A,B)) { C = sub(A,B); } else { C = sub(B,A); // 交換 cout << "-"; // 輸出 - 表明負數 } for(int i = C.size() - 1; ~i; i --) cout << C[i]; cout << endl << r << endl; return 0; } void ClearZero(vector<int> &A) { while(A.size() > 1 && A.back() == 0) A.pop_back(); return ; } bool cmp(vector<int> &A,vector<int> &B) { if(A.size() != B.size()) return A.size() >= B.size(); for(int i = A.size(); ~i; i --) { // 倒序 if(A[i] != B[i]) { // 長度相同時則進行字典序比較 return A[i] > B[i]; } } return true; } vector<int> sub(vector<int> &A, vector<int> &B) { vector<int>C; int t = 0; for(int i = 0; i < A.size(); i ++) { t = A[i] - t; if(B.size() > i) t -= B[i]; C.push_back((t + 10) % 10); if(t < 0) t = 1; // 若是獲得的是負數,說明須要借位,這時候下次計算時就須要 - 1 else t = 0; } while(C.size() > 1 && C.back() == 0) C.pop_back(); // Clear 前導 0 return C; }
PK一下函數
#include <vector> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main(void) { vector<int> mul(vector<int> &A,int b); vector<int>A,B,C; string a; int value; cin >> a >> value; for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0'); C = mul(A,value); for(int i = C.size() - 1; ~i; i --) cout << C[i]; return 0; } vector<int> mul(vector<int> &A,int b) { int t = 0; vector<int> C; for(int i = 0; i < A.size(); i ++) { // 模擬乘法過程 t += A[i] * b; C.push_back(t % 10); t /= 10; } while(t) { // 處理最後的那個數 C.push_back(t % 10); t /= 10; } return C; }
PK一下spa
#include <vector> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int main(void) { vector<int> div(vector<int> &A,int b,int &r); vector<int>A,B,C; string a; int value; cin >> a >> value; for(int i = a.length() - 1; ~i; i --) A.push_back(a[i] - '0'); int r; // 餘數 C = div(A,value,r); for(int i = C.size() - 1; ~i; i --) cout << C[i]; cout << endl << r << endl; return 0; } vector<int> div(vector<int> &A,int b,int &r) { // 引用變量,至關因而全局變量,直接在函數內部進行修改 vector<int> C; r = 0; // 初始化 for(int i = A.size() - 1; ~i; i --) { // 除法是從高位向低位進行的 r = r * 10 + A[i]; // 獲得除數,每次向後移動一位(餘數要乘 10 -- 能夠模擬一下,很好理解) C.push_back(r / b); // 剛開始可能爲 0 r %= b; } reverse(C.begin(),C.end()); // 反轉是爲了處理前導 0 while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; }