LeetCode43. 字串相乘
阿新 • • 發佈:2019-01-30
給定兩個以字串形式表示的非負整數 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; } };