大整数乘法分治C语言
时间: 2023-11-23 17:54:30 浏览: 104
大整数乘法(c语言)
以下是大整数乘法分治的C语言实现:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 10010
int a[MAXN], b[MAXN], c[MAXN];
void multiply(int *a, int *b, int *c, int len) {
if (len <= 64) { // 当长度小于等于64时,直接暴力计算
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
c[i + j] += a[i] * b[j];
}
}
return;
}
int mid = len / 2;
multiply(a, b, c, mid); // 计算ah*bh
multiply(a + mid, b + mid, c + len, len - mid); // 计算al*bl
int tmp[MAXN] = {0};
multiply(a, b + mid, tmp, mid); // 计算ah*bl
for (int i = 0; i < len - mid; i++) {
c[mid + i] += tmp[i];
}
multiply(a + mid, b, tmp, mid); // 计算al*bh
for (int i = 0; i < len - mid; i++) {
c[mid + i] += tmp[i];
}
}
int main() {
char str1[MAXN], str2[MAXN];
scanf("%s%s", str1, str2);
int len1 = strlen(str1), len2 = strlen(str2);
for (int i = 0; i < len1; i++) {
a[i] = str1[len1 - i - 1] - '0';
}
for (int i = 0; i < len2; i++) {
b[i] = str2[len2 - i - 1] - '0';
}
multiply(a, b, c, 1 << 14); // 1 << 14 表示2的14次方,即16384
int len = len1 + len2 - 1;
while (len > 0 && c[len] == 0) {
len--;
}
for (int i = len; i >= 0; i--) {
printf("%d", c[i]);
}
return 0;
}
```
阅读全文