問題描述:
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.
一個數字以字符串的形式相乘,這就意味着傳統的乘法肯定不能滿足,計算機表示不了那麼大的數字
解題思路:
模擬乘法的豎式運算,具體過程見代碼註釋,我這寫的太臃腫了,大神們都是四五十行搞定,這也導致我耗時很長,144ms勉強AC吧。
class Solution
{
public:
string multiply(string num1, string num2)
{
string result;
map<int, int> numMap1;
map<int, int> numMap2;
map<int, int> numMap3;
//特殊情況
if (("0" == num1) || ("0" == num2)) {
return "0";
}
//將每一位上的數字字符當做科學計數法來表示a*pow(10,b),
//如123中的2,記爲2*pow(10,1),用map存放2和指數1
int base1,exponent1;
exponent1 = num1.length()-1;
for(unsigned int i=0; i<num1.length(); i++)
{
base1 = num1[i]-'0';
numMap1[exponent1--] = base1;
}
int base2,exponent2;
exponent2 = num2.length()-1;
for(unsigned int i=0; i<num2.length(); i++)
{
base2 = num2[i]-'0';
numMap2[exponent2--] = base2;
}
//模擬乘法的手算方式,但此處我只是計算,該進位的並沒有進位
for( map<int, int>::iterator iter1 = numMap1.begin(); iter1 != numMap1.end(); iter1++)
{
for( map<int, int>::iterator iter2 = numMap2.begin(); iter2 != numMap2.end(); iter2++)
{
int key;
key = iter1->first + iter2->first;
numMap3[key] += iter1->second * iter2->second;
}
}
//完成進位,需要多次反覆計算,直到所有的a都是個位數
for( map<int, int>::iterator iter3 = numMap3.begin(); iter3 != numMap3.end(); iter3++)
{
int key = iter3->first;
int value = iter3->second;
if(value > 9)
{
numMap3[key] = value % 10;
while(true)
{
value = value / 10;
key++;
numMap3[key] += value % 10;
if(value == 0)
break;
}
}
}
//本來可以輸出結果了,到這兒一看結果是反的
for( map<int, int>::iterator iter3 = numMap3.begin(); iter3 != numMap3.end(); iter3++)
{
result += iter3->second + '0';
}
char temp;
//沒辦法,字符串逆序
for(size_t i=0; i<result.length()/2; i++)
{
temp=result[i];
result[i]=result[result.length()-i-1];
result[result.length()-i-1]=temp;
}
//這個逆序之後第一個數字可能是0,得去掉,原因嘛,好好琢磨
if(result[0] == '0')
result = result.substr(1,result.length()-1);
return result;
}
};