1 知识点
大整数 + 大整数,它们的长度都为
1
0
6
10^6
106。大整数是指长度为
1
0
6
10^6
106的整数。
大整数 - 大整数
大整数 * 小整数
大整数 / 小整数
把大整数存储到向量中,需要考虑高位在前还是低位在前,低位在前会更好一些。
2 模板
//A = [1,2,3,4]表示数4321
//B和C也是如此
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) {
if (i < A.size()) {
t += A[i];
}
if (i < B.size()) {
t += B[i];
}
C.emplace_back(t % 10);
t /= 10;
}
if (t) {
C.emplace_back(1);
}
return C;
}
3 工程化
题目1:计算两个大整数的相加结果。
思路:直接调用大整数相加的模板即可。
#include <iostream>
#include <vector>
using namespace std;
//vector<int>表示的整数,低位在前。
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) {
if (i < A.size()) {
t += A[i];
}
if (i < B.size()) {
t += B[i];
}
C.emplace_back(t % 10);
t /= 10;
}
if (t) {
C.emplace_back(1);
}
return C;
}
int main() {
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; --i) {
A.emplace_back(a[i]-'0');
}
for (int i = b.size() - 1; i >= 0; --i) {
B.emplace_back(b[i] - '0');
}
vector<int> C = add(A, B);
//输出结果
for (int i = C.size() - 1; i >= 0; --i) {
cout << C[i];
}
cout << endl;
return 0;
}
上述代码可以进行优化,比如压位,9位整成向量A中的一个元素。C++代码如下,
#include <iostream>
#include <vector>
using namespace std;
const int base = 1e9;
//vector<int>表示的整数,低位在前。
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) {
if (i < A.size()) {
t += A[i];
}
if (i < B.size()) {
t += B[i];
}
C.emplace_back(t % base);
t /= base;
}
if (t) {
C.emplace_back(1);
}
return C;
}
int main() {
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; --i) {
s += (a[i] - '0') * t;
j++, t *= 10;
if (j == 9 || i == 0) {
A.emplace_back(s);
s = j = 0;
t = 1;
}
}
for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; --i) {
s += (b[i] - '0') * t;
j++, t *= 10;
if (j == 9 || i == 0) {
B.emplace_back(s);
s = j = 0;
t = 1;
}
}
vector<int> C = add(A, B);
//输出结果
cout << C.back();
for (int i = C.size() - 2; i >= 0; --i) {
printf("%09d", C[i]);
}
cout << endl;
return 0;
}