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

 

大数乘法,直接用例子模拟算法,比如321*25

下标 0 1 2
num1 3 2 1
num2 2 5  

 

 

 

    3 2 1
      2 5
321分别乘以5   15 10 5
321分别乘以2 6 4 2  
上两行相加 6 19 12 5
处理进位得到结果 8 0 2 5
下标 0 1 2 3

 

 

 

 

 

 

 

模拟发现中间结果值存放位置下标与num1和num2中数下标对应关系,假设i 是num1的元素的下标,j 是num2中元素的下标,那么num1[i] * num[j] 存放在 i+j 中,由于需要处理进位,那么可以最前面留出一个元素空位

m位乘数 * n位乘数的结果最长为m+n位

 1 class Solution {
 2 public:
 3     string multiply(string num1, string num2) {
 4         if( num1.empty() || num2.empty() ) return string();
 5         vector<int> num(num1.length()+num2.length(), 0);    //结果最长为m+n位
 6         for(int i=0; i<num1.length(); ++i)
 7             for(int j=0; j<num2.length(); ++j)
 8                 num[i+j+1] += (num1[i]-'0') * (num2[j]-'0');    //放在i+j+1位,让num[0]空出,好处理进位
 9         int carry = 0;
10         for(int i=num.size()-1; i>=0; --i) {    //从后往前处理进位
11             int sum = num[i] + carry;
12             num[i] = sum % 10;
13             carry = sum / 10;
14         }
15         int idx = 0;
16         while( idx < num.size() && num[idx] == 0 ) ++idx;   //寻找第一个不为0的数
17         if( idx >= num.size() ) return string("0"); //找不到,说明结果为0
18         string ans;
19         while( idx < num.size() ) {
20             ans.push_back(num[idx]+'0');    //输出到字符串中
21             ++idx;
22         }
23         return ans;
24     }
25 };

 

posted on 2014-10-05 17:15  bug睡的略爽  阅读(126)  评论(0编辑  收藏  举报

导航