您的位置:首页 > 其它

Leetcode: Multiply Strings

2014-12-04 15:01 309 查看
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.

分析:对于此题,如果按照平时我们算乘法的办法,先将乘数的第一位乘以被乘数,然后第二位乘以被乘数,。。直到乘数的最后一位乘以被乘数,然后把上述结果错位相加。这里有一个规律,被乘数第i位和乘数第j位相乘的结果将加在结果的第i+j和第i+j+1位(模10的余数在第i+j位,进位在第i+j+1位),那么我们可以很方便的实现两个字符串的乘法。代码如下:

class Solution {
public:
string multiply(string num1, string num2) {
string result;
int n1 = num1.length(), n2 = num2.length();
if(n1 == 0 || n2 == 0) return result;

vector<int> res(n1+n2, 0);//use vector stores multiply result
reverse(num1.begin(), num1.end());//reverse string
reverse(num2.begin(), num2.end());

for(int i = 0; i < n1; i++){
int v1 = num1[i] - '0';
for(int j = 0; j < n2; j++){
int v2 = num2[j] - '0';
res[i+j] += v1*v2;
res[i+j+1] += res[i+j]/10;
res[i+j] %= 10;
}
}

transform(find_if(res.rbegin(), prev(res.rend()), [](int i){return i > 0;}),res.rend(), back_inserter(result), [](int i){return i + '0';});//transform each int in vector<int> to char, also remove preceding zeroes but the last zero
return result;
}
};


transform函数的运用使代码行数更少,find_if(res.begin(), prev(res.rend()), [](int i){return i > 0;})除去结果中的preceding zeroes同时由于使用prev(res.rend())保护了只有一个0的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: