您的位置:首页 > 其它

leetcode 第42题 Multiply Strings

2014-10-27 23:12 330 查看
题目: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.

就是实现大数乘法。嘿嘿,我先用long long直接乘试试手感,试过了不行。所以还是要用字符串表示才行。

我是这样做的,先实现两个子函数,一个是实现一个数和一个字符串的数相乘的结果。另一个是实现两个字符串相加的结果。这样,大数乘法就可以由其中一个大数的每一位和另一个大数相乘然后再相加,就是要注意分解一个大数的时候记得要在结果后面加上零。例如12乘以3,我们把12分成1和2分别和3相乘,然后1和3相乘的后面要加一个零,因为1处于12的十位数。

oj上居然用了148ms。不忍直视啊。写了那么长。。。虽然Accept了

class Solution {
public:
string multiply(string num1, string num2)
{
if (num1 == "0" || num2 == "0")
return "0";
string s = "";
int len1 = num1.size(), len2 = num2.size();
vector<int> container(len1+len2, 0); // 用来存表中红色部分值

for (int i = 0; i < len1; ++i)
for (int j = 0; j < len2; ++j)
{
container[i+j] += (num1[len1 - 1 - i]-'0')*(num2[len2 - 1 - j]-'0'); // 注意标号
}
//处理进位
int up = 0, cnt = 0;
while(cnt<len1+len2)
{
container[cnt] += up;
up = container[cnt]/10;
container[cnt] %= 10;
cnt++;
}
cnt--;
while(cnt > -1 && !container[cnt])//不应该有的零去掉
{
cnt--;
};
while(cnt > -1) // 输出就是结果,注意方向被搞反了
{
char ch = container[cnt] + '0';
s += ch;
cnt--;
}
return s;
}
};


View Code
这个主要是注意存的方向,不要把小标弄混淆了。输出的时候也要注意,别搞反了。低于60ms过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: