题目:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
1.num1 和 num2 的长度小于110。
2.num1 和 num2 只包含数字 0-9。
3.num1 和 num2 均不以零开头,除非是数字 0 本身。
4.不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
源码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char * multiply(char * num1, char * num2){
int len1 = (int) strlen(num1);
int len2 = (int) strlen(num2);
char * ret = (char*) malloc(sizeof(char) * (len1+len2 + 1));
for(int i = 0; i < len1+len2+1; i++) {
ret[i] = '0';
}
int len = 0;
for(int i = len1 - 1; i >= 0; i--) {
int out = 0;
int cur = len1 - i - 1;
for(int j = len2 - 1; j >= 0; j--) {
out += (num1[i]-'0') * (num2[j] - '0');
ret[cur] = (out += (ret[cur] - '0') ) % 10 + '0';
out/=10;
cur++;
}
//printf("%d %d\n", out, cur);
while(out) {
ret[cur] = (out += (ret[cur] - '0') ) % 10 + '0';
cur++;
out/=10;
}
len = len > cur ? len : cur;
// printf("%d ", len);
// puts(ret);
}
while(ret[len-1] == '0' && (len - 1) ) {
len--;
}
ret[len] = '\0';
//printf("%d\n", len);
for(int i = 0; i < len / 2; i++) {
char t = ret[i];
ret[i] = ret[len - i - 1];
ret[len - i - 1] = t;
}
return ret;
}
char * multiply(char * num1, char * num2){
int len1 = strlen(num1);
int len2 = strlen(num2);
int num = 0;
int value, i, j;
char *returnResult = (char *)malloc( sizeof(char) * (len1 + len2 + 1));
returnResult[len1 + len2] = '\0';
for( i = 0; i < len1 + len2; i++){
returnResult[i] = '0';
}
for( j = len2 - 1; j >= 0; j--){
num = 0;
for(i = len1 - 1; i >= 0; i--){
value = returnResult[ i + j + 1] - '0' + (num1[i] - '0') * (num2[j] - '0') + num;
returnResult[ i + j + 1] = value%10 + '0';
num = value/10;
}
returnResult[i + j + 1] = num + '0';
}
for(i = 0; i< (len1 + len2 - 1); i++){
if( returnResult[i] != '0' ){
break;
}
}
return returnResult + i ;
}