43. Multiply Strings(重要)
原创
©著作权归作者所有:来自51CTO博客作者mb63887cf57331d的原创作品,请联系作者获取转载授权,否则将追究法律责任
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.
- Converting the input string to integer is NOT
- You should NOT use internal library such as BigInteger.
Subscribe to see which companies asked this question
class Solution {
public:
string multiply(string num1, string num2) {
int m = num1.size();
int n = num2.size();
vector<int> res(m+n,0);
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
res[i+j+1] += (num1[i]-'0') * (num2[j]-'0');
}
}
int carry = 0;
for (int i = m + n-1; i >= 0; i--){
int tmp = res[i] + carry;
res[i] = tmp % 10;
carry = tmp / 10;
}
int i = 0;
while (i<m+n&&res[i] == 0) i++;//注意有乘以0的情况发生
string ret;
for (; i < m + n; i++){
ret += res[i] + '0';
}
return ret.empty() ? "0" : ret;
}
};
几个附带的问题。
1.大数字符串相加
string addString(string num1, string num2){
int m = num1.size();
int n = num2.size();
int k = max(m, n);
vector<int> res(k + 1, 0);
int i = m - 1, j = n - 1;
int carry = 0;
while (i >= 0 || j >= 0){
int d1 = i >= 0 ? num1[i] - '0' : 0;
int d2 = j >= 0 ? num2[j] - '0' : 0;
int tmp = d1+ d2+ carry;
res[k] = tmp % 10;
carry = tmp / 10;
i--; j--; k--;
}
i = 0;
while (i <= max(m, n) && res[i] == 0) i++;
string ret;
if (carry) ret += carry + '0';
for (; i <= max(m, n); i++){
ret += res[i] + '0';
}
return ret.empty() ? "0" : ret;
}
2.大数字符串相减
从后向前模拟减法,计算每一位的值时,用被减数的位减去减数,再加上10,再减去借位,结果模上10就行了。
借位则是看之前的结果是否小于10,如果小于10说明借位了。
string coreSub(string num1, string num2){
int m = num1.size() - 1;
int n = num2.size() - 1;
int borrow = 0;
vector<int> res(m+1, 0);
while (m >= 0){
int d1 = num1[m] - '0';
int d2 = n >= 0 ? num2[n] - '0' : 0;
int tmp = d1 - d2 + 10 - borrow;
res[m] = tmp % 10;
borrow = tmp < 10 ? 1 : 0;
m--;
n--;
}
int i = 0;
while (i < num1.size() && res[i] == 0) i++;
string ret;
for (; i < num1.size(); i++){
ret += res[i] + '0';
}
return ret.empty() ? "0" : ret;
}
string subString(string num1, string num2){
int m = num1.size();
int n = num2.size();
if (m > n){
return coreSub(num1, num2);
}
else if (m < n){
return "-"+coreSub(num2, num1);
}
else{
if (num1 > num2){
return coreSub(num1, num2);
}
else if (num1 < num2){
return "-" + coreSub(num2, num1);
}
else{
return "0";
}
}
}
测试:
cout << subString("12", "34") << endl;
cout << subString("12345", "78") << endl;
cout << subString("0", "0") << endl;
-22
12267
0