1. 程式人生 > >LeetCode43. 字串相乘

LeetCode43. 字串相乘

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。

示例 1:

輸入: num1 = "2", num2 = "3"
輸出: "6"

示例 2:

輸入: num1 = "123", num2 = "456"
輸出: "56088"

題目分析:如果兩個字串中有一個為0,則結果是0;否則的話,將其中一個數A的最末位(即個位)和另一個數B相乘,將結果儲存到ans陣列中去,然後將A的十位與B相乘,將結果累加到ans中去,然後將A的百位與B相乘,加到ans中去……,這裡加的時候每次要向後移一位。最後,規範化ans陣列,即把數值超過10的那一位向後進一位,使得每位上的值都在0~9之間,最後輸出ans即可。

程式碼展示:

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
        int numA[110],numB[110];
        for(int i=0;i<num1.length();i++)
            numA[i] = num1[i]-'0';
        for(int i=0;i<num2.length();i++)
            numB[i] = num2[i]-'0';
        int ans[250];
        memset(ans,0,sizeof(int)*250);
        for(int i=num1.length()-1;i>=0;i--){
            int carry = 0;   //表示進位
            for(int j=num2.length()-1;j>=0;j--){
                ans[num1.length()-1-i+num2.length()-1-j] += (numA[i]*numB[j]+carry)%10;
                carry = (numA[i]*numB[j]+carry)/10;
                if(j==0)
                    ans[num1.length()-1-i+num2.length()-1+1] = carry;
            }
        }
        for(int i=0;i<249;i++){
            if(ans[i]>=10){
                ans[i+1] += ans[i]/10;
                ans[i] = ans[i]%10;
            }
        }
        string str = "";
        bool flag = false;
        for(int i=249;i>=0;i--){
            if(ans[i]!=0 || flag){
                str += char(ans[i]+'0');
                flag = true;
            }      
        }
        return str;
    }
};