高精度加减乘除
基本操作
字符串存vector:
for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
去前导零:(除了加法,其他三种操作都需要去除前导零)
while(C.size() > 1 && C.back() == 0) C.pop_back();
加法
注意点:
1.如果数字B比数字A长,怎么处理?
2.处理完了数字长度短一点的B,该怎么做?
3.最高位还有没有进位?
核心思想:用一个进位t存储进位t、A[i]、B[i]的和,再将进位处理之后存入C。
vector<int> add(vector<int> &A, vector<int> &B) {
if(A.size() < B.size()) return add(B, A);
vector<int> C;
int t = 0;
for(int i = 0; i < A.size(); i ++) {
t += A[i];
if(i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
if(t) C.push_back(t);
return C;
}
减法
注意点:
1.处理完了数字长度短一点的B,该怎么做?
2.注意存数字C时t的处理方式。
3.借位在最后怎么表示?
核心思想:t是借位也是A-B的结果。
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(i < B.size()) {
t -= B[i];
}
C.push_back((t + 10) % 10);
if(t < 0) {
t = 1;
} else {
t = 0;
}
}
while(C.back() == 0 && C.size() > 1) C.pop_back();
return C;
}
此外,减法操作需要一个cmp函数,对比数字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;
}
乘法
注意点:
1.因为t是乘出来的,所以值可能会是一个比较大的数,在A最高位处理完之后,怎么处理进位t多出来的数?
2.在A最高位处理完后,怎么处理A?
核心思想:很像加法,用t存A[i]*b,再处理t即可。
vector<int> mul(vector<int> A, int b) {
vector<int> C;
int t = 0;
for(int i = 0; i < A.size() || t; i ++) {
if(i < A.size()) {
t += A[i] * b;
}
C.push_back(t % 10);
t /= 10;
}
while(C.back() == 0 && C.size() > 1) C.pop_back();
return C;
}
除法
注意点:
1.除法多个余数r。
2.reverse转置C,即注意C的存储方式,要按照加减乘中来,以便统一。
3.r/b而不是r/10,r %= b而不是r %= 10。
核心思想:上一轮的余数乘10加上本轮的个位数去除被除数,并将结果存到C中。
vector<int> div(vector<int> &A, int b, int &r) {
vector<int> C;
int t = 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.back() == 0 && C.size() > 1) {
C.pop_back();
}
return C;
}
浙公网安备 33010602011771号