题目描述
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
算法:
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
// 反转字符串中[left,right]区间的字符.
static void reverseString( char s[], int left, int right ) {
char temp = '\0';
while( left < right ) {
temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
// 字符串的模拟加法,将结果存回s1中.
static void additionString( char s1[], char s2[] ) {
char buf[BUFSIZ] = {'\0'};
int ib = 0, i1 = 0, i2 = 0, n = 0, jw = 0;
while( '\0' != s1[i1] || '\0' != s2[i2] || jw > 0 ) {
n = jw;
n += '\0' != s1[i1] ? s1[i1++] - '0' : 0;
n += '\0' != s2[i2] ? s2[i2++] - '0' : 0;
jw = n < 10 ? 0 : 1;
n -= n < 10 ? 0 : 10;
buf[ib++] = n + '0';
}
strcpy( s1, buf );
}
char *multiply( char *num1, char *num2 ) {
int len1 = strlen( num1 ), len2 = strlen( num2 );
int i1 = 0, i2 = 0;
int jw = 0, n = 0;
char buf[BUFSIZ] = {'\0'};
int bi = 0;
char *returnArray = NULL;
if( num1[0] == '0' && num1[1] == '\0' ) { // 例如, num1="0", num2="123".
return num1;
}
if( num2[0] == '0' && num2[1] == '\0' ) { // 例如: num1="123", num2="0".
return num2;
}
if( num1[0] == '1' && num1[1] == '\0' ) { // 例如: num1="1", num2="123".
return num2;
}
if( num2[0] == '1' && num2[1] == '\0' ) { // 例如: num1="123", num2="1".
return num1;
}
returnArray = malloc( sizeof(char) * 54321 );
returnArray[0] = '\0';
for( i2 = len2 - 1; i2 >= 0; --i2 ) {
jw = 0;
for( bi = 0; bi < len2 - 1 - i2; ++bi ) { // 补0.
buf[bi] = '0';
}
for( i1 = len1 - 1; i1 >= 0 || jw > 0; --i1 ) {
n = num2[i2] - '0';
n *= i1 >= 0 ? num1[i1] - '0' : 0;
n += jw;
jw = n / 10;
n = n % 10;
buf[bi++] = n + '0';
}
buf[bi] = '\0';
additionString( returnArray, buf ); // 做加法.
}
reverseString( returnArray, 0, strlen( returnArray ) - 1 ); // 反转.
return returnArray;
}