您的位置:首页 > 其它

Multiply Strings - LeetCode

2015-05-08 05:12 288 查看
思路:

如果num1有i位,num2有j位。结果最多有(i+j)位, 例如99*99 = 9801

结果中的某位置的数和两个乘数是有关的。

res[3]位 = num1的第0个数 * num2的第3个数 + num1的第1个数*num2的第2个数 + num1的第3个数+ num2的第0个数 + 进位。

注意:这里num1第0个数(最低位)是指i = 0, num[num1.length()-1-i]

注意:当一个数乘完还要将最后的进位放入下一位中。

注意:输入的数可能是“00001234” 太坏了。

v[i+num2.length()] += carry;


时间复杂度:

两个for循环,O(mn)

Code (C++):

class Solution {
public:
string multiply(string num1, string num2) {
if(num1.length()==0 || num2.length()== 0) return 0;
vector<int> v(num1.length()+num2.length(), 0);
for(int i = 0; i < num1.length(); i++)
{
int a = num1[num1.length()-1-i]-'0';
int carry = 0;
for(int j = 0; j < num2.length(); j++)
{
int b= num2[num2.length()-1-j] - '0';
v[i+j] += a*b+carry;
carry = v[i+j]/10;
v[i+j]%=10;
}
v[i+num2.length()] += carry;
}
int i = v.size()-1;     //004321000,后面三个0,因为是高位的0所以一定是,"0001234"这样的string干的
while(i>0&&v[i]==0) i--;
string res = "";
while(i>=0)   //004321 => 123400
res += to_string(v[i--]);
return res;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: