写出大整数乘法分治的c语言代码
时间: 2023-05-25 22:05:37 浏览: 137
以下是使用分治算法进行大整数乘法的C语言代码:
```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
// 功能:高精度加法
// 输入:两个字符串,代表两个被加数
// 输出:返回一个新的字符串,代表两个被加数的和
char* add(char* a, char* b){
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = (len_a > len_b) ? len_a + 1 : len_b + 1;// 结果字符串的长度,加一是因为可能进位
char* c = (char*)malloc((len_c + 1) * sizeof(char));
int i, j, k, carry = 0;
for(i = len_a - 1, j = len_b - 1, k = len_c - 1; k >= 0; i--, j--, k--){// 从低位到高位同时遍历两个字符串
int da = (i >= 0) ? a[i] - '0' : 0;// 若已经遍历完,则赋值为0
int db = (j >= 0) ? b[j] - '0' : 0;
int dc = da + db + carry;// 计算当前位的和
carry = dc / 10;// 计算下一位的进位
c[k] = dc % 10 + '0';// 将当前位的和的个位放入结果字符串中
}
while(c[0] == '0') c++;// 去掉无用的前导0
char* ans = (char*)malloc((len_c - (c - c)) * sizeof(char));
strcpy(ans, c);// 将结果字符串的内容复制到新的字符串中
free(c);// 释放内存
return ans;
}
// 功能:高精度减法
// 输入:两个字符串,代表被减数和减数
// 输出:返回一个新的字符串,代表被减数减去减数的差
char* sub(char* a, char* b){
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = (len_a > len_b) ? len_a : len_b;// 结果字符串的长度,不加一
char* c = (char*)malloc((len_c + 1) * sizeof(char));
int i, j, k, borrow = 0;
for(i = len_a - 1, j = len_b - 1, k = len_c - 1; k >= 0; i--, j--, k--){// 从低位到高位同时遍历两个字符串
int da = (i >= 0) ? a[i] - '0' : 0;// 若已经遍历完,则赋值为0
int db = (j >= 0) ? b[j] - '0' : 0;
int dc = da - db - borrow;// 计算当前位的差
borrow = 0;
while(dc < 0){// 如果当前位为负数,则向高位借位
borrow++;// 借位次数加1
dc += 10;// 当前位加上10
}
c[k] = dc % 10 + '0';// 将当前位的差的个位放入结果字符串中
}
while(c[0] == '0' && c[1] != '\0') c++;// 去掉无用的前导0
char* ans = (char*)malloc((len_c - (c - c)) * sizeof(char));
strcpy(ans, c);// 将结果字符串的内容复制到新的字符串中
free(c);// 释放内存
return ans;
}
// 功能:高精度乘法
// 输入:两个字符串,代表两个被乘数
// 输出:返回一个新的字符串,代表两个被乘数的积
char* mul(char* a, char* b){
int len_a = strlen(a);
int len_b = strlen(b);
if(len_a == 0 || len_b == 0) return "0";// 特殊情况处理
if(len_a == 1 && a[0] == '0') return "0";// 特殊情况处理
if(len_b == 1 && b[0] == '0') return "0";// 特殊情况处理
if(len_a == 1 && a[0] == '1') return b;// 特殊情况处理
if(len_b == 1 && b[0] == '1') return a;// 特殊情况处理
if(len_a < len_b){// 保证a的长度不小于b的长度
char* temp = a;
a = b;
b = temp;
int temp_len = len_a;
len_a = len_b;
len_b = temp_len;
}
int i;
char* a1 = (char*)malloc((len_a / 2 + 1) * sizeof(char));
for(i = 0; i < len_a / 2; i++) a1[i] = a[i];// 取a的前一半
a1[i] = '\0';
char* a2 = (char*)malloc((len_a - len_a / 2 + 1) * sizeof(char));
for(i = 0; i < len_a - len_a / 2; i++) a2[i] = a[i + len_a / 2];// 取a的后一半
a2[i] = '\0';
char* b1 = (char*)malloc((len_b / 2 + 1) * sizeof(char));
for(i = 0; i < len_b / 2; i++) b1[i] = b[i];// 取b的前一半
b1[i] = '\0';
char* b2 = (char*)malloc((len_b - len_b / 2 + 1) * sizeof(char));
for(i = 0; i < len_b - len_b / 2; i++) b2[i] = b[i + len_b / 2];// 取b的后一半
b2[i] = '\0';
char* p1 = mul(a1, b1);// 计算a1*b1
char* p2 = mul(a2, b2);// 计算a2*b2
char* p3 = mul(add(a1, a2), add(b1, b2));// 计算(a1+a2)*(b1+b2)
char* p4 = sub(p3, add(p1, p2));// 计算(a1+a2)*(b1+b2)-a1*b1-a2*b2
char* mul_res = add(add(p1, p2), p4);// 将p1、p2和p4加起来就是最终结果
free(a1);
free(a2);
free(b1);
free(b2);
free(p1);
free(p2);
free(p3);
free(p4);
return mul_res;
}
int main(){
char a[10001] = "12345678901234567890";
char b[10001] = "98765432109876543210";
char* res = mul(a, b);
printf("%s", res);
return 0;
}
```
阅读全文