Multiply Strings

来源:互联网 发布:mysql 最多从库 编辑:程序博客网 时间:2024/06/18 15:11

算法题目: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.

大致意思:给定两个字符串数字num1,num2,数字可以无限大且非负,求这两个字符数的乘积,以string类型返回

解题思路:用一个长度为num1.size()+num2.size()的字符串ret保存结果,用一个carry数据记录各位上的进位,其长度为两个字符串数的长度和,且初始化为0,对应num1中的第i位上的数和num2上的第j 位数的乘积保存在ret的第i+j位上,最后对进位进行处理。

    string multiply(string num1, string num2) {        if(num1.size()==0||num2.size()==0)return "";        else if(num1=="0"||num2=="0")return "0";        string ret(num1.size()+num2.size()-1,'0');        vector<int> carry(num1.size()+num2.size(),0);        for(int i=0;i<num1.size();i++)        {            for(int j=0;j<num2.size();j++)            {                int sum=(num1[i]-'0')*(num2[j]-'0')+ret[i+j]-'0';                ret[i+j]=sum%10+'0';                carry[i+j]+=sum/10;            }        }        for(int i=ret.size()-1;i>=0;i--)        {            int sum=ret[i]-'0'+carry[i+1];            ret[i]=sum%10+'0';            carry[i]+=sum/10;        }        return carry[0]>0?string(1,'0'+carry[0])+ret:ret;    }

另外一种思路,根据乘法运算的步骤做的,计算量较大:

    string AddCore(string& s1,string& s2,int c)    {        if(s1.size()==0&&s2.size()==0&&c==0)return "";        int ca=0,cb=0;        string subs1="";        string subs2="";        if(s1.size()!=0)        {            subs1=s1.substr(0,s1.size()-1);            ca=s1[s1.size()-1]-'0';        }        if(s2.size()!=0)        {            subs2=s2.substr(0,s2.size()-1);            cb=s2[s2.size()-1]-'0';        }        int m=(ca+cb+c)%10;        c=(ca+cb+c)/10;        return AddCore(subs1,subs2,c)+string(1,m+'0');    }    string StringAdd(string& s1,string& s2)    {        return AddCore(s1,s2,0);    }    string multiply(string num1, string num2) {        if(num1.size()==0||num2.size()==0)return "";        else if(num1=="0"||num2=="0")return "0";        string ret="";        int zeronum=0;        for(int i=num2.size()-1;i>=0;i--,zeronum++)        {            string s(num1.size(),'0');            int k=num2[i]-'0';            int c=0;            for(int j=num1.size()-1;j>=0;j--)            {                int sum=(num1[j]-'0')*k+c;                c=sum/10;                s[j]=sum%10+'0';            }            if(c>0)s=string(1,'0'+c)+s;            for(int j=0;j<zeronum;j++)            {                s+='0';            }            ret=StringAdd(s,ret);        }        return ret;    }
0 0
原创粉丝点击