Given two non-negative integers num1
and num2
represented as strings, return the product of num1
and num2
, also represented as a string.
Example 1:
Input: num1 = "2", num2 = "3" Output: "6"
Example 2:
Input: num1 = "123", num2 = "456" Output: "56088"
Note:
- The length of both
num1
andnum2
is < 110. - Both
num1
andnum2
contain only digits0-9
. - Both
num1
andnum2
do not contain any leading zero, except the number 0 itself. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
思路一:
把输入数字翻转,然后注意到 result[i+j] = a[i] * b[j];
最后把结果再翻转过来:
int mystrlen(char *str)
{
char *tmp = str;
while(*tmp++ != '\0');
return tmp - str - 1;
}
void swap(char *str)
{
int len = mystrlen(str);
int i;
for(i = 0; i < len/2; ++i)
{
char tmp = str[i];
str[i] = str[len-i-1];
str[len-i-1] = tmp;
}
}
char * multiply(char * number1, char *number2 )
{
swap(number1);
swap(number2);
int tmp[1000] ={0,};
int len1 = mystrlen(number1);
int len2 = mystrlen(number2);
char *result = (char *)malloc(len1 + len2 + 1);
int i, j;
for(i = 0; i < len1; ++i)
{
for(j = 0; j < len2; ++j)
{
tmp[i +j] += (number1[i] - '0') * (number2[j] - '0');
}
}
int add = 0;
for(i = 0; i < len1 + len2 - 1; ++i)
{
tmp[i] += add;
if(tmp[i] > 9)
{
add = tmp[i] / 10;
tmp[i] = tmp[i] % 10;
}
else
{
add = 0;
}
}
if(add > 0)
{
tmp[i] = add;
}
while(i >=0 && tmp[i] == 0)
{
--i;
}
j = 0;
while( i >= 0)
{
result[j] = tmp[i] + '0';
--i;
++j;
}
if(j == 0)
{
result[j++] = '0';
}
result[j] = '\0';
return result;
}
思路2:
参考下面的图 (转自:https://blog.csdn.net/kangkanglou/article/details/79894208):
int mystrlen(char *str)
{
char *tmp = str;
while(*tmp++ != '\0');
return tmp - str - 1;
}
char * multiply(char * number1, char *number2 )
{
int len1 = mystrlen(number1);
int len2 = mystrlen(number2);
int *tmp = (int *)malloc(sizeof(int) *(len1+len2));
int i, j;
for(i = 0; i < len1+len2; ++i)
{
tmp[i] = 0;
}
for(i = len1 -1; i>= 0; --i)
{
for(j = len2 -1; j >=0; --j)
{
int multi = (number1[i]-'0')*(number2[j]-'0');
tmp[i+j] += (multi+tmp[i+j+1])/10;
tmp[i+j+1] = (multi+tmp[i+j+1])%10;
}
}
i = 0;
while( i < len1+len2 && tmp[i] == 0 )
{
++i;
}
char *result = (char *)malloc(sizeof(char) * (len1+len2+1));
j = 0;
while(i < len1+len2)
{
result[j] = tmp[i] + '0';
++i;
++j;
}
if(j == 0)
{
result[j++] = '0';
}
result[j] = '\0';
return result;
}
参考:
https://blog.csdn.net/kangkanglou/article/details/79894208