一.问题描述
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.
二.我的解题思路
这道题考的实际上就是正整数乘法的实现。由于题目中明确说明整数可以任意大,所以自然不能利用编译器实现的乘法运算直接去做。我的做法是把两个大整数的乘法拆分成求乘积每一位的数字,如12*12=144.那我就是需要挨个求出4,4,1这样三个数字。
假定要求a*b,我是先把a,b分别存成整数数组的形式。然后遍历这两个数组,求解相应位的乘积和。再加上进位,即可求出res。测试通过的程序如下:
class Solution {
public:
string multiply(string num1, string num2) {
string res("");
int len1 = num1.length(); vector<int> pos1;
int len2 = num2.length(); vector<int> pos2;
if(len1==1&&num1[0]=='0')
return "0";
if(len2==1&&num2[0]=='0')
return "0";
const int res_len = len1 + len2;
int * flag = new int[res_len];
int * res_num = new int[res_len];
for (int i = 0; i < len1 + len2; i++){ flag[i] = 0; res_num[i] = 0; }
for (int i = len1 - 1; i >= 0; i--)
pos1.push_back(num1[i] - '0');
for (int i = len2 - 1; i >= 0; i--)
pos2.push_back(num2[i] - '0');
for (int i = 0; i<len1; i++){
for (int j = 0; j<len2; j++){
res_num[i + j] += pos1[i] * pos2[j];
}
}
int i = 0;
for ( i = 0; i<len1 + len2-1; i++){
int curr = res_num[0];
if (i>0)
curr = res_num[i] + flag[i - 1];
if (curr >= 10){
flag[i] = curr / 10;
curr = curr % 10;
}
char curr_flag = '0' + curr;
res =curr_flag+res;
}
if (flag[i - 1] > 0){
char curr_flag = '0' + flag[i-1];
res = curr_flag + res;
}
return res;
}
};