用c++写Karatsuba乘法,要求代码后要带有注释
时间: 2024-02-06 16:10:16 浏览: 54
以下是使用C++编写的Karatsuba乘法算法,附有注释说明:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 定义 Karatsuba 乘法函数
vector<int> karatsuba(vector<int>& num1, vector<int>& num2) {
int n = num1.size();
vector<int> result(n * 2);
// 递归基础情况
if (n == 1) {
int mul = num1[0] * num2[0];
result[0] = mul % 10;
result[1] = mul / 10;
return result;
}
int halfSize = n / 2;
// 分裂 num1 和 num2
vector<int> num1L(num1.begin(), num1.begin() + halfSize);
vector<int> num1H(num1.begin() + halfSize, num1.end());
vector<int> num2L(num2.begin(), num2.begin() + halfSize);
vector<int> num2H(num2.begin() + halfSize, num2.end());
// 计算 a, b, c 和 d
vector<int> a = karatsuba(num1H, num2H);
vector<int> b = karatsuba(num1L, num2L);
vector<int> c = karatsuba(num1L + num1H, num2L + num2H);
for (int i = 0; i < n; i++) {
c[i] -= a[i] + b[i];
}
// 合并结果
for (int i = 0; i < n; i++) {
result[i + halfSize] += c[i];
result[i] += b[i];
result[i + n] += a[i];
}
// 处理进位
for (int i = 0; i < n * 2 - 1; i++) {
result[i + 1] += result[i] / 10;
result[i] %= 10;
}
return result;
}
int main() {
// 定义两个需要相乘的数
vector<int> num1 = { 1, 2, 3, 4 };
vector<int> num2 = { 5, 6, 7, 8 };
// 调用 karatsuba 函数进行相乘
vector<int> result = karatsuba(num1, num2);
// 输出结果
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i];
}
cout << endl;
return 0;
}
```
注释说明:
1. `vector<int> karatsuba(vector<int>& num1, vector<int>& num2)`:定义 Karatsuba 乘法函数,参数为需要相乘的两个数的向量形式。
2. `int n = num1.size();`:获取需要相乘的两个数的长度。
3. `vector<int> result(n * 2);`:定义结果向量,长度为需要相乘的两个数的长度的两倍。
4. `if (n == 1) {...}`:递归基础情况,当需要相乘的两个数长度为 1 时,直接返回结果。
5. `int halfSize = n / 2;`:计算需要相乘的两个数长度的一半。
6. `vector<int> num1L(num1.begin(), num1.begin() + halfSize);`:将 num1 分裂为左半部分 num1L。
7. `vector<int> num1H(num1.begin() + halfSize, num1.end());`:将 num1 分裂为右半部分 num1H。
8. `vector<int> num2L(num2.begin(), num2.begin() + halfSize);`:将 num2 分裂为左半部分 num2L。
9. `vector<int> num2H(num2.begin() + halfSize, num2.end());`:将 num2 分裂为右半部分 num2H。
10. `vector<int> a = karatsuba(num1H, num2H);`:递归计算 a。
11. `vector<int> b = karatsuba(num1L, num2L);`:递归计算 b。
12. `vector<int> c = karatsuba(num1L + num1H, num2L + num2H);`:递归计算 c。
13. `for (int i = 0; i < n; i++) {c[i] -= a[i] + b[i];}`:计算 c。
14. `for (int i = 0; i < n; i++) {result[i + halfSize] += c[i]; result[i] += b[i]; result[i + n] += a[i];}`:合并结果。
15. `for (int i = 0; i < n * 2 - 1; i++) {result[i + 1] += result[i] / 10; result[i] %= 10;}`:处理进位。
16. `vector<int> result = karatsuba(num1, num2);`:调用 karatsuba 函数进行相乘。
17. `for (int i = result.size() - 1; i >= 0; i--) {cout << result[i];}`:输出结果。
阅读全文