43 Multiply Strings

43 Multiply Strings

链接:https://leetcode.com/problems/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.

Hide Tags Math String

两个数字存在string中,求两个数字的乘积。假设两个数字string是num1,num2。我想到的最直接的做法取num1中每一位数字乘以num2得到积,把所有的积相加就是最后的结果。

class Solution {
    public:
        string multiply(string num1, string num2) 
        {
            if(num1=="0"||num2=="0")
                return "0";
             string result="";
             reverse(num1.begin(),num1.end());
             reverse(num2.begin(),num2.end());

        for(int i=0;i<num1.length();i++)
        {
            string temp="";
            int j=0;
            while(j++<i)
            temp+="0";

            temp+=mulstring(num2,num1[i]-'0');
           result=addstring(result,temp);
        }

            reverse(result.begin(),result.end());

            return result;
    }
    string addstring(string num1, string num2)
    {
     string result="";
       int flag=0;
       int num;
       int i=0;
       for(;i<num1.length()&&i<num2.length();i++)
       {
           num=(num1[i]-'0')+(num2[i]-'0')+flag;
           flag=num/10;
           result+=num%10+'0';
       }
       for(;i<num1.length();i++)
       {
         num=num1[i]-'0'+flag;
         flag=num/10;
         result+=num%10+'0';
       }
           for(;i<num2.length();i++)
       {
         num=num2[i]-'0'+flag;
         flag=num/10;
         result+=num%10+'0';
       }
           if(flag!=0)
               result+=flag+'0';

           return result;
    }
    string mulstring(string num1,int n)
    {
       string result="";
       int flag=0,num;
       for(int i=0;i<num1.length();i++)
       {
        num=n*(num1[i]-'0')+flag;
        flag=num/10;
        result+=num%10+'0';
       }
        if(flag!=0)
               result+=flag+'0';
        return result;
    }
};

还有一种相比而言代码更简单,效率更高的做法。

class Solution {
public:
   string multiply(string num1, string num2) {  
        if(num1=="0" || num2=="0") return "0";  

        int l1 = num1.length(), l2 = num2.length();  
        int* n1 = new int[l1];  
        int* n2 = new int[l2];  
        int* res = new int[l1+l2];
        memset(res,0,sizeof(int)*(l1+l2));  
        string result = "";  


        for(int i=0; i<l1; ++i)  
            n1[i] = num1[i] - '0';  
        for(int i=0; i<l2; ++i)  
            n2[i] = num2[i] - '0';  

        for(int i=0; i<l1; ++i)  
            for (int j=0; j<l2; ++j)  
                res[i+j+1] += n1[i]*n2[j];  


        for (int k=l1+l2-1; 0<k; k--)
        {  
            res[k-1] += res[k]/10;  
            res[k] %= 10;  
            result+= res[k]+'0';  
        }  
        if(res[0]!=0)
         result+=res[0]+'0';  
         reverse(result.begin(),result.end());

        return result;  
    }  
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值