題目描述
給定兩個以字符串形式表示的非負整數 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;
}