學渣帶你刷Leetcode0043字符串相乘

題目描述

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章