您的位置:首页 > 其它

[LeetCode]43 高精度乘法

2016-03-07 20:49 323 查看

Multiply Strings(高精度乘法)

【难度:Medium】

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.

实现高精度非负整数乘法。

解题思路

按照常规解法,用字符串操作来模拟乘法的步骤可以先实现字符串高精度加法,再将加法运用到乘法过程中。这种方法简单但是耗时比较大,这里介绍一种比较巧妙的方法,借鉴LeetCode上的一份高票代码。



观看上图,它描述的是我们计算乘法的过程。仔细分析可以发现,对于原来在上面字符串中下标为1的“2”和在下面字符串中下标为0的“4”的相乘结果08出现在了最后的乘法结果字符串的下标1和2处。这一结果对其他下标的数字同样成立:下标i和下标j相乘的高位结果位于下标i+j处,低位位于下标i+j+1处。根据这个结果,实现高精度的乘法就变得简单了。

c++代码如下:

//高票代码版本
class Solution {
public:
string multiply(string num1, string num2) {
int m = num1.size();
int n = num2.size();
vector<int> array(m+n);
string ans = "";
for (int i = m-1; i >= 0; i--) {
for (int j = n-1; j >= 0; j--) {
int index1 = i + j;
int index2 = i + j + 1;
int sum = (num1[i]-'0')*(num2[j]-'0')+array[index2];
array[index1] += sum / 10;
array[index2] = sum % 10;
}
}

for (auto v:array) {
if (ans.size() != 0 || v != 0)
ans  += to_string(v);
}

return ans.size() == 0?"0":ans;
}
};


//简单但低效版本
class Solution {
public:
string multiply(string num1, string num2) {
if(num1.empty())
return num2;
if (num2.empty())
return num1;
if (num1.size() == 1 && num1[0] == '0')
return "0";
if (num2.size() == 1 && num2[0] == '0')
return "0";

string ans = "";
int count = -1;
for (int i = num1.size()-1;i >= 0; i--) {
string tmp = "";
int carry = 0;
count++;
for (int j = num2.size()-1; j >= 0; j--) {
int m = (num1[i]-'0')*(num2[j]-'0')+carry;
carry = m / 10;
tmp = to_string(m%10)+tmp;
}
if (carry)
tmp = to_string(carry)+tmp;
int count_tmp = count;
while (count_tmp) {
tmp = tmp + "0";
count_tmp--;
}

ans = add(ans,tmp);
}
return ans;
}
string add(string num1, string num2) {
if(num1.empty())
return num2;
if (num2.empty())
return num1;

int carry = 0;
int i = num1.size()-1;
int j = num2.size()-1;
string ans = "";

while (i >= 0 && j >= 0) {
int m = (num1[i]-'0')+(num2[j]-'0')+carry;
carry = m / 10;
ans = to_string(m%10) + ans;
i--;
j--;
}
while (i >= 0) {
int m = (num1[i]-'0')+carry;
carry = m / 10;
ans = to_string(m%10) + ans;
i--;
}
while (j >= 0) {
int m = (num2[j]-'0')+carry;
carry = m / 10;
ans = to_string(m%10) + ans;
j--;
}
if (carry)
ans = to_string(carry)+ans;
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: