解决方法 :咱们能够把一个很大的数当作字符串进行处理,这时候就须要用到高精度。
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; }