LeetCode算法題之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.
一個數字以字符串的形式相乘,這就意味着傳統的乘法肯定不能滿足,計算機表示不了那麼大的數字
解題思路:
模擬乘法的豎式運算,具體過程見代碼註釋,我這寫的太臃腫了,大神們都是四五十行搞定,這也導致我耗時很長,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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章