char * addStrings(char * num1, char * num2){
//从两个数字最后一位开始相加, add是表示进位
int i = strlen(num1) - 1, j = strlen(num2) - 1, add = 0;
//定义char指针并分配空间,fmax是c语言库函数
char* ans = (char*)malloc(sizeof(char) * (i + j + 5));
int anslen = 0;
//计算
while(i >= 0 || j >= 0 || add != 0){
/*你可能会想两个数字位数不同怎么处理,
这里我们统一在指针当前下标处于负数的时候返回 0,
等价于对位数较短的数字进行了补零操作。*/
int x = i >= 0 ? num1[i] - '0' : 0;
int y = j >= 0 ? num2[j] - '0' : 0;
//x, y 和进位相加
int result = x + y + add;
ans[anslen++] = '0' + result % 10;
//进位数字
add = result / 10;
//从低到高依次相加
i--, j--;
}
//计算结果翻转过来
for (int i = 0; 2 * i < anslen; i++){
char t = ans[i];
ans[i] = ans[anslen - i - 1], ans[anslen - i - 1] = t;
}
ans[anslen++] = 0;
return ans;
}
char * multiply(char * num1, char * num2){
//分别长度
int m = strlen(num1), n = strlen(num2);
char* ans = malloc(sizeof(char) * 2);
ans[0] = '0', ans[1] = 0;
//num1为0或者num2为0之后返回0
if ((m == 1 && num1[0] == '0') || (n == 1 && num2[0] == '0')) {
return ans;
}
//循环
for(int i = n - 1; i >= 0; i--){
//num1长度+num2长度+5
char* curr = malloc(sizeof(char) * (n + m + 5));
int currlen = 0;
int add = 0;
//curr数组初始化
for (int j = n - 1; j > i; j --){
curr[currlen++] = 0;
}
int y = num2[i] - '0';
for(int j = m - 1; j >= 0; j--){
int x = num1[j] - '0';
//计算,先乘积,在求和
int product = x * y + add;
curr[currlen++] = product % 10;
//进位
add = product / 10;
}
//判断进位
while(add != 0){
curr[currlen++] = add % 10;
add /= 10;
}
//高低位交换
for (int i = 0; 2 * i < currlen; i++){
char t = curr[i];
curr[i] = curr[currlen - 1 - i];
curr[currlen - 1 - i] = t;
}
//需要注意的是,num2\textit{num}_2num2 除了最低位以外,其余的每一位的运算结果都需要补 000。
for(int i = 0; i < currlen; i++){
curr[i] += '0';
}
curr[currlen++] = 0;
//最后相加
char* tmp = addStrings(ans, curr);
free(ans), free(curr);
ans = tmp;
}
return ans;
}
运行时间
好像拿C语言写的好像很少啊,我看题解拿Python写的比较多