c语言代码,实现大数相乘
时间: 2024-09-26 17:03:36 浏览: 40
用C语言实现两大数相乘
在C语言中,由于整型数据类型的限制,直接处理非常大的数值可能会导致溢出。因此,对于大数相乘,我们通常采用分治法,即"Karatsuba算法"或"Schoolbook算法",这里我将简要介绍如何使用Karatsuba算法。
```c
#include <stdio.h>
#define MAX_DIGITS 100
// 函数用于分割大数并返回数组形式
void split(int n, int *digits) {
digits[0] = n % 10;
for (int i = 1; n /= 10; i++) {
digits[i] = n % 10;
}
}
// 合并两个数组形成一个大的数字
int merge(const int *digits, int len) {
int result = 0;
for (int i = len - 1; i >= 0; i--) {
result += digits[i] * pow(10, i);
}
return result;
}
// Karatsuba乘法的核心函数
int karatsuba(int a[], int b[], int len) {
if (len <= 1) return merge(a, len) * merge(b, len);
int mid = len / 2;
int a1[] = {0}, a2[] = {0}, b1[] = {0}, b2[] = {0};
for (int i = 0; i < mid; i++) {
a1[i] = a[i];
b1[i] = b[i];
}
for (int i = mid; i < len; i++) {
a2[i - mid] = a[i];
b2[i - mid] = b[i];
}
// 分治递归计算两部分的乘积
int ac = karatsuba(a1, a2, mid), bc = karatsuba(b1, b2, mid);
int ad = karatsuba(a1, b2, mid), bd = karatsuba(a2, b1, mid);
// 计算差值
int x = ac + bd - ad;
// 合成结果
return (ac * pow(10, 2*mid)) + ((ad + x) * pow(10, mid)) + merge(b1, mid);
}
int main() {
int a[MAX_DIGITS], b[MAX_DIGITS], len_a = 0, len_b = 0;
printf("请输入第一个大数(以空格分隔每个位):");
scanf("%d", &a[len_a++]);
while (scanf("%d", &a[len_a]) == 1) {
len_a++;
}
printf("请输入第二个大数(以空格分隔每个位):");
scanf("%d", &b[len_b++]);
while (scanf("%d", &b[len_b]) == 1) {
len_b++;
}
split(a[len_a - 1], a);
split(b[len_b - 1], b);
int product[] = {0}; // 存储结果的大数组
int result_len = karatsuba(a, b, len_a > len_b ? len_a : len_b);
product[0] = result_len;
printf("乘积:");
split(product[0], product);
for (int i = 0; i < result_len; i++) {
printf("%d", product[i]);
}
printf("\n");
return 0;
}
```
这个程序实现了Karatsuba算法来处理大数相乘。注意,它只适用于输入的是整数,并且长度不超过`MAX_DIGITS`。使用时记得适当调整`MAX_DIGITS`的值以适应实际需求。
阅读全文