4.3 高精度除法优化(大数除以大数)
优化技巧:
- 二分试商:
int trial_quotient(vector<int>& A, vector<int>& B) {
int left = 0, right = 9;
while (left <= right) {
int mid = (left + right) / 2;
vector<int> product = multiply(B, mid);
if (compare(product, A) <= 0 &&
compare(multiply(B, mid + 1), A) > 0)
return mid;
else if (compare(product, A) > 0)
right = mid - 1;
else
left = mid + 1;
}
return left;
}
- 预处理除数:
pair<vector<int>, int> normalize(vector<int>& A, vector<int>& B) {
int scale = 10 / (B.back() + 1);
vector<int> A_scaled = multiply(A, scale);
vector<int> B_scaled = multiply(B, scale);
return {B_scaled, scale};
}
- 使用更高效的减法:
void subtract_in_place(vector<int>& A, vector<int>& B) {
int borrow = 0;
for (int i = 0; i < A.size(); i++) {
int diff = A[i] - borrow;
if (i < B.size()) diff -= B[i];
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
A[i] = diff;
}
while (A.size() > 1 && A.back() == 0)
A.pop_back();
}