您的位置:首页 > 其它

[leetcode] 43.Multiply Strings

2015-08-31 00:33 453 查看
题目:

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.

题意:

给定两个字符串形式的整数,每个整数都是非负的,并且是任意大的。求出两者乘积的字符串表示。

思路:

我们不妨思考当初小学学习数学时手动乘法的方法。比如23*14,那么先让4与23相乘,然后让1与23相乘,不过此时要将这一位的乘积往左移动一位,就相当于在这一位的乘积末尾加了一个0。然后让两个位上的乘积相加。

所以我们需要做的就是计算乘数的每一位与被乘数的乘积,并且加上先前位数上的结果。实现一个字符串的加法函数作为辅助函数。

以上。

代码如下:

class Solution {
public:
string multiply(string num1, string num2) {
int len1 = num1.length();
int len2 = num2.length();
if (len1 == 0 || len2 == 0)return "";
if (len2 > len1) {
swap(num1, num2);
swap(len1, len2);
}
string result = "";
int addZero = 0;
for (int i = len2 - 1; i >= 0; i--) {
int carry = 0;
string temp(len1, ' ');
for (int j = len1 - 1; j >= 0; j--) {
int multiRes = (num2[i] - '0') * (num1[j] - '0') + carry;
carry = multiRes / 10;
multiRes %= 10;
temp[j] = multiRes + '0';
}
if (carry != 0)
temp = char(carry + '0') + temp;
string zeros(addZero, '0');
temp += zeros;
result = add(result, temp);
addZero++;
}
int i = 0;
while (i < result.size() && result[i] == '0')i++;
return (i == result.size())?"0":result.substr(i);
}

string add(string num1, string num2) {
int len1 = num1.length();
int len2 = num2.length();
if (len2 > len1) {
swap(len1, len2);
swap(num1, num2);
}
num2 = string(len1 - len2, '0') + num2;
string result(len1, ' ');
int carry = 0;
for (int i = len1 - 1; i >= 0; i--) {
int sum = (num1[i] - '0') + (num2[i] - '0') + carry;
carry = sum / 10;
sum %= 10;
result[i] = sum + '0';
}
if (carry)result = "1" + result;
return result;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: