Multiply Strings
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.
这道题就是模拟乘法思维了,还需要模拟加法思维,每一位乘以一个数都要和前面的结果加起来。
注意:
1 要把这两个操作过程分清楚,不能混饶了,否则会结果不正确的。
2 乘法有进位,和前面的结果加起来也有加法进位,一定要分清楚。
3 每一次一个新数位与被乘数相乘之前,都一定要把两个进位加在结果上。
4 同时需要把两个进位值都清零。
我基本上都是栽在这几个点上了,不然不用花那么长时间,思考问题的思路还是不够清晰,仍然需要继续提高啊!
string multiply(string num1, string num2) {
int n1 = num1.length();
int n2 = num2.length();
if(n1 == 0 || n2 == 0) return "0";
int upto = 0;
int sumupto = 0;
string sum;
int s = 0;
sum.resize(n1+n2, '0');
int i, j;
for (i = n1-1; i >= 0; i--)
{
int a = num1[i] - '0';
//注意:每次新开始upto进位值都要清零
for (j = n2-1, upto = 0; j >= 0; j--)
{
int b = num2[j] - '0';
s = b * a + upto;
upto = s / 10;
//注意:要系统分析,先计算出乘法,处理好,之后再处理加法。
int rmd = s%10;
int sij1 = sum[i+j+1] - '0';
int rs = rmd + sij1 + sumupto;
sumupto = rs/10;
rs %= 10;
sum[i+j+1] = rs + '0';
}
//注意:把最后一次的进位值加上!
//注意:要把加法进位和乘法进位都加上
sum[i+j+1] += (upto+sumupto);
//注意:加法进位一定需要清零
sumupto = 0;
}
while (sum.length() > 1 && sum[0] == '0') sum.erase(sum.begin());
return sum;
}
/*令人难以想象的特殊情况
Input: "9133", "0"
Output: "0000"
Expected: "0"
*/
思考算法问题都是令人头疼的事情,需要毅力去坚持!
思路更加清晰,程序更加简洁了:
//2014-1-27
string multiply(string num1, string num2)
{
string rs(num1.length()+num2.length(), '0');
for (int i = num1.length()-1, d = rs.length()-1; i >= 0; i--, d--)
{
int carry = 0, k = d;
for (int j = num2.length()-1; j >= 0; j--, k--)
{
int a = num1[i] - '0';
int b = num2[j] - '0';
a = a*b+carry + (rs[k]-'0');
carry = a/10;
rs[k] = a%10 + '0';
}
while (carry)
{
int sum = carry + (rs[k]-'0');
carry = sum / 10;
rs[k--] = sum % 10 + '0';
}
}
while (rs.size() > 1 && rs[0] == '0') rs.erase(rs.begin());
return rs;
}