• 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;
        }
    };
  • 相关阅读:
    mysql 的远程链接字符
    SqlSessionFactoryUtil
    mysql 的链接字符
    web 项目运用通用的xml配置
    配置文件转意符使用
    new和newInstance的区别
    子选择器与后代选择器的区别
    Vivado_HLS 学习笔记1-数据类型
    Vivado_HLS 学习笔记3-循环的pipeline与展开
    Vivado_HLS 学习笔记2-接口综合
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10663299.html
Copyright © 2020-2023  润新知