- 大整数存入数组:从该数值低位到高位,依次存入数组下标从0到
- 运算(模拟人工计算的过程):
- 加法:每次都是三数进行相加 A(i) + B(i) + t(t为进位,取0或1).
/*计算两个大整数相加*/ #include<iostream> #include<vector> using namespace std; // C = A + B 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++) { // A(i) + B(i) + t 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); return C; } int main() { string a, b; vector<int> A, B; cin >> a >> b; for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');//若输入是123456,则A = {6, 5, 4, 3, 2, 1} for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0'); auto C = add(A, B);//auto让编译器自己推断变量类型 for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]); }
- 减法:首先调整为大数减小数,每次计算是三数进行A(i) – B(i) – t(t为上一位的进位,取0或1),若结果大于0,则不动;若结果小于0,则需要加10.
/*计算两个大整数相减*/ #include<iostream> #include<vector> using namespace std; //判断是否有A大于等于B bool cmp(vector<int> &A, vector<int> &B) { if(A.size() != B.size()) return A.size() > B.size(); for(int i = A.size() - 1; i >= 0; i --) { if(A[i] != B[i]) return A[i] > B[i]; return true; } } // C = A - B vector<int> sub(vector<int> &A, vector<int> &B) { vector<int> C; for(int i = 0, t = 0; i < A.size(); i ++) { t = A[i] - t; if(i < B.size()) t -= B[i]; C.push_back((t + 10) % 10);//达到结果大于0时不动,小于0时加10的效果 if(t < 0) t = 1; else t = 0; } //输出处理,防止出现“003”这种输出 while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a, b; vector<int> A, B; cin >> a >> b; for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');//若输入是123456,则A = {6, 5, 4, 3, 2, 1} for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0'); if(cmp(A, B)) { auto C = sub(A, B); for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]); } else { auto C = sub(B, A); printf("-"); for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]); } }
- 乘法(大整数A乘小整数b):每次计算得到的数为(A*b+t)%10,每次进位的数t = (A*b+t)/10.
#include<iostream> #include<vector> using namespace std; //C = A * b vector<int> mul(vector<int> &A, int b) { vector<int> C; int t = 0; for(int i = 0; i < A.size() || t; i++) { //如果i已经在A容量之外却还没有结束循环,则是t值不为零,即将最高位进位存入 if(i < A.size()) t += A[i] * b; C.push_back(t % 10); t /= 10; } return C; } int main() { string a; int b; cin >> a >> b; vector<int> A; for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); auto C = mul(A, b); for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]); return 0; }
- 除法(大整数A除以小整数b):使用大整数的每一位分别除以小整数A(i)/b得到结果的某一位,接下来使用余数与大整数的下一位数的组合A(i)%b+A(i-1)重复上面步骤,最终没除尽的作为余数。
#include<iostream> #include<vector> #include<algorithm> using namespace std; // A / b = C ···r vector<int> div(vector<int> &A, int b, int &r) { vector<int> C; r = 0; //除法是从最高位开始算的 for(int i = A.size() - 1; i >= 0; i --) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while(C.size() > 1 && C.back() == 0) C.pop_back(); return C; } int main() { string a; int b; cin >> a >> b; vector<int> A; for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0'); int r; auto C = div(A, b, r); for(int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]); cout << endl << r << endl; return 0; }