给出一个C语言大整数乘法程序
时间: 2024-12-08 16:17:07 浏览: 31
在C语言中实现大整数乘法通常采用“长除法”(也称为“Karatsuba算法”或“Strassen算法”的变种,因为它们可以处理更大的数值而不需要占用大量的内存),尤其是当数字位数超过计算机能直接表示范围时。这里我将简述一个基于分治思想的基本大数乘法算法:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_DIGITS 100 // 定义最大数字位数
typedef struct {
int digit[MAX_DIGITS]; // 数组存储每一位
int size; // 表示数字的位数
} bigint;
// 合并两个bigint
void merge(bigint *a, bigint *b) {
if (b->size > a->size) {
bigint temp = *a;
*a = *b;
*b = temp;
}
for (int i = 0; i < b->size; ++i) {
a->digit[i + b->size] = b->digit[i];
}
a->size += b->size;
}
// 加法函数
void add(bigint *a, bigint *b) {
while (b->size > a->size) {
merge(a, b);
}
for (int i = 0; i < a->size; ++i) {
a->digit[i] += b->digit[i];
if (a->digit[i] >= 10) {
a->digit[i] -= 10;
a->digit[i + 1]++;
}
}
while (a->digit[a->size - 1] == 0 && a->size > 1) {
a->size--;
}
}
// 小数点前的乘法
void mult_core(bigint *res, bigint *a, bigint *b) {
bigint zero = {0, 0}; // 初始化为零
if (a->size == 0 || b->size == 0) {
return;
}
// 分治乘法
int len = max(a->size, b->size);
bigint half_len = len / 2;
// 分别计算两部分的乘积
bigint part1[2], part2[2];
part1[0].size = part1[1].size = half_len;
part2[0].size = part2[1].size = half_len;
for (int i = 0; i < half_len; ++i) {
part1[0].digit[i] = a->digit[i];
part1[1].digit[i] = a->digit[i + half_len];
part2[0].digit[i] = b->digit[i];
part2[1].digit[i] = b->digit[i + half_len];
}
// 递归乘法
mult_core(&part1[0], &part1[0], &part2[0]);
mult_core(&part1[1], &part1[0], &part2[1]);
mult_core(&part2[0], &part1[1], &part2[1]);
// 结果合并
bigint carry;
carry.size = 1;
carry.digit[0] = 0;
add(&carry, &part1[0]);
add(&carry, &part1[1]);
add(&carry, &part2[0]);
add(&carry, &part2[1]);
res->size = len;
for (int i = 0; i < len; ++i) {
res->digit[i] = carry.digit[i];
}
}
// 大数乘法
void bigmult(bigint *result, bigint *a, bigint *b) {
bigint t1 = *a, t2 = *b;
result->size = 0;
// 翻转较小的数
if (t1.size > t2.size) {
bigint temp = t1;
t1 = t2;
t2 = temp;
}
// 进行逐位乘法
for (int i = 0; i <= t1.size; ++i) {
bigint temp;
temp.size = t2.size + 1;
mult_core(&temp, &t1, &t2);
add(result, &temp);
t2.size += 1;
t2.digit[t2.size] = 0;
t2.digit[t2.size - 1]--;
}
}
int main() {
bigint num1, num2, product;
printf("请输入第一个大整数(按空格分隔每个位): ");
scanf("%d", &num1.digit[num1.size]);
while (scanf("%*d") != EOF) {
num1.size++;
}
num1.size--;
printf("请输入第二个大整数(按空格分隔每个位): ");
scanf("%d", &num2.digit[num2.size]);
while (scanf("%*d") != EOF) {
num2.size++;
}
num2.size--;
bigmult(&product, &num1, &num2);
printf("结果: ");
for (int i = product.size - 1; i >= 0; --i) {
printf("%d", product.digit[i]);
}
printf("\n");
return 0;
}
```
这个程序实现了基本的大整数乘法,用户输入两个大整数,然后程序会计算他们的乘积。注意这只是一个简化版的实现,实际应用可能会有更高效的优化。
阅读全文