c语言基于分治思想设计一个大整数乘法的实现程序,可以进行两个大整数的乘法 运算,要求时间复杂度小于 O(n 2 )。 【输入】 分行输入两个大整数,两个整数的长度可以不相同,如果输入的不是合法的 整数,应提示重新输入。
时间: 2024-03-07 17:48:53 浏览: 58
好的,下面是基于分治思想设计的大整数乘法实现程序的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
int check_int(char *num) {
// 检查输入是否为合法整数
int len = strlen(num);
for (int i = 0; i < len; i++) {
if (num[i] < '0' || num[i] > '9') {
return 0;
}
}
return 1;
}
int multiply(char *A, char *B) {
// 大整数乘法的分治算法实现
int lenA = strlen(A), lenB = strlen(B);
if (lenA < lenB) {
char *temp = A;
A = B;
B = temp;
int temp_len = lenA;
lenA = lenB;
lenB = temp_len;
}
if (lenA == 1 || lenB == 1) {
return atoi(A) * atoi(B);
}
int n = lenA;
int m = n / 2;
char A1[m+1], A2[n-m+1], B1[m+1], B2[n-m+1];
strncpy(A1, A, m);
A1[m] = '\0';
strcpy(A2, A+m);
strncpy(B1, B, m);
B1[m] = '\0';
strcpy(B2, B+m);
int P1 = multiply(A1, B1);
int P2 = multiply(A2, B2);
char A1A2[m+n+1], B1B2[m+n+1];
sprintf(A1A2, "%d", atoi(A1) + atoi(A2));
sprintf(B1B2, "%d", atoi(B1) + atoi(B2));
int P3 = multiply(A1A2, B1B2);
return P1 * 10 * (2*m) + (P3 - P1 - P2) * 10 * m + P2;
}
int main() {
char A[100], B[100];
while (1) {
printf("请输入第一个大整数:");
fgets(A, 100, stdin);
A[strlen(A)-1] = '\0';
if (check_int(A)) {
break;
}
printf("输入不合法,请重新输入。\n");
}
while (1) {
printf("请输入第二个大整数:");
fgets(B, 100, stdin);
B[strlen(B)-1] = '\0';
if (check_int(B)) {
break;
}
printf("输入不合法,请重新输入。\n");
}
int C = multiply(A, B);
printf("两个大整数的积为:%d\n", C);
return 0;
}
```
需要注意的是,这个算法对于非常大的整数仍然可能会超时。如果需要处理更大的数据,可以考虑使用 Karatsuba 算法或者其他更为高效的算法。
阅读全文