Multiply Strings

本文介绍了两种方法来实现字符串形式的无限大数字相乘,包括逐位相乘累加和核心递归相加法,重点阐述了进位处理和结果拼接过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法题目: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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值