Problem:
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.
Analysis:
Solutions:
C++:
int GetPromote(int &digit)
{
int pro = digit / 10;
digit %= 10;
return pro;
}
string multiply(string num1, string num2) {
string product;
if(num1 == "" || num2 == "" || num1[0] == '0' || num2[0] == '0') {
product = "0";
return product;
}
int tail_zero = 0;
bool valid = false;
vector<int> num_1;
for(int i = num1.size() - 1; i >= 0; --i) {
if(!valid) {
if(num1[i] == '0') {
++tail_zero;
continue;
} else
valid = true;
}
num_1.push_back(num1[i] - '0');
}
valid = false;
vector<int> num_2;
for(int i = num2.size() - 1; i >= 0; --i) {
if(!valid) {
if(num2[i] == '0') {
++tail_zero;
continue;
} else
valid = true;
}
num_2.push_back(num2[i] - '0');
}
vector<int> v_product;
for(int i = 0; i < num_2.size(); ++i) {
for(int j = 0; j < num_1.size(); ++j) {
int raw_prod = num_1[j] * num_2[i];
int prom = GetPromote(raw_prod);
if(v_product.size() == i + j) {
v_product.push_back(raw_prod);
if(prom > 0)
v_product.push_back(prom);
} else if(v_product.size() == i + j + 1) {
v_product[v_product.size() - 1] += raw_prod;
int add_one = GetPromote(v_product[v_product.size() - 1]);
if(prom + add_one > 0)
v_product.push_back(prom + add_one);
} else {
v_product[i + j] += raw_prod;
int add_one = GetPromote(v_product[i + j]);
v_product[i + j + 1] += prom + add_one;
for(int l = i + j+ 1; l < v_product.size(); ++l) {
add_one = GetPromote(v_product[l]);
if(add_one) {
if(l == v_product.size() - 1) {
v_product.push_back(add_one);
break;
} else
v_product[l + 1] += add_one;
} else
break;
}
}
}
}
for(int i = v_product.size() - 1; i >= 0; --i) {
product.push_back(v_product[i] + '0');
}
for(int i = 0; i < tail_zero; ++i)
product.push_back('0');
return product;
}
Java
:
Python: