Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
对两组非负数字进行相乘,使用数组表示数字,且题目中说明数组很大,因此,因此不能直接将数组转换成数字相乘。这道题目是要求自己构造乘法的思路,需要注意的地方主要为进位的处理。
这道题目直接去计算不仅慢,而且很容易造成进位的错误,对于同一个数字上的值不仅来自相乘的结果,还有低位上进位的结果,且乘法不同于加法每次进位最多为1,只需要判断9的个数即可(类似字符串加1的题目可见:LeetCode (14) Plus One)。这里使用下面的思路就可以很优雅的解决问题了:
在去除s3前面的0的时候需要注意从s3[0]处理到s3[s3.size()-2],避免两个0相乘的结果得到s3为”00”,所有0均被删除掉。
代码如下:
class Solution {
public:
void reverse(string& s)
{
int i = 0;
int j = s.size() - 1;
while (i < j)
{
swap(s[i++], s[j--]);
}
}
string multiply(string num1, string num2) {
reverse(num1);
reverse(num2);
int length = num1.size() + num2.size();
int* m = new int[length]();
for (size_t i = 0; i != num1.size(); ++i)
{
for (size_t j = 0; j != num2.size(); ++j)
{
m[i + j] += (num1[i] - ‘0‘) * (num2[j] - ‘0‘);
}
}
string r;
for (int i = 0; i != length; ++i)
{
int digit = m[i] % 10;
int carry = m[i] / 10;
if (i + 1 < length)
{
m[i + 1] += carry;
}
r.insert(0, 1, (digit + ‘0‘));
}
int i = 0;
while (r[i] == ‘0‘ && i < r.size()-1)
++i;
r.erase(0, i);
delete[] m;
return r;
}
};
LeetCode (19) Multiply Strings
原文地址:http://blog.csdn.net/angelazy/article/details/45195983