LeetCode 43 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

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

示例 2:

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

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解题思路:

1、乘数的每一位转换成int型,然后与被乘数相乘,取得中间结果temp[i]。 如“12” * “123”,则中间结果为 “36”、“230”、“1200”。(注意这里高位应该相应的增大多个十倍)

2、将1得到的每一个中间结果temp相加。

代码:

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1[0]-'0'==0 || num2[0]=='0')
            return "0";
        string ans="";
        int k=0;
        int JW=0;   //1、进位
        vector<string> temp(120,"");  //2、很有必要初始化,因为要从某一个字符串开始填充数字字符
        for(int i=num1.size()-1; i>=0; i--)   
        {
            JW=0;
            int kk=k;
            while(kk--)
                temp[i] += '0';    //3、乘数的高位乘被乘数时,中间结果应该是多个十倍,如:1*21, 计算1*1时的中间结果为1,而1*2时的中间结果为20
           for(int j=num2.size()-1; j>=0; j--)
           {
               int u1 = num1[i]-'0';
               int u2 = num2[j]-'0';
               if((u1*u2+JW)/10 > 0)
               {
                   temp[i] += ((u1*u2+JW)%10+'0'); //4、解释说明第2条,i初始不是0,一开始从第i个string开始填充
                   JW = (u1*u2 + JW)/10;
               }
               else
               {

                   temp[i] += ((u1*u2 + JW)+'0');
                   JW = 0;
               }

           }
            if(JW)
            {
                temp[i] += JW+'0';
            }
            k++;  //5、对应解释第3条
        }
//以下是把中间结果相加
        int y=0;
        int len = temp[0].size(); //6、注意这里最长的应该是第0个数组,因为上面的i是倒序的,即乘数的最高位和被乘数相乘后得到的字符串应该最长
        JW = 0;

        for(int i=0; i<len; i++)
        {
            y=0;
            for(int j=0; j<num1.size(); j++)  //7、这里j的上限应该是乘数的位数,因为有多少个乘数就有多少个中间结果
            {
                if( i < temp[j].size()){  //8、一定要注意这里,i的循环上限是最长的string的大小,但不是每一个中间结果都那么长,所以不加判断就会导致y加上了空值,程序出错
                    y += temp[j][i]-'0';
                }
            }

            if((y+JW)/10 > 0)
            {
                ans += (y+JW)%10+'0';
                JW = (y+JW)/10;
            }
            else
            {
                ans += (y+JW)+'0';
                JW = 0;
            }
        }
        if(JW)
            ans += JW+'0';
        string res="";
        for(int i=ans.size()-1; i>=0; --i)
            res += ans[i];
        return res;
    }
};

猜你喜欢

转载自www.cnblogs.com/moxiangfeng/p/10663299.html