LeetCode43-字符串相乘

LeetCode43-字符串相乘

Leetcode / 力扣

43. 字符串相乘:

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

注意: 不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

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

示例 2:

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

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

解题思路1:

大数乘法模板题,直接用就行

class Solution {
    //大数乘法(要用到大数加法)
    string add(string a,string b)
    {
        string s;
        int len1,len2;
        len1=a.size()-1;
        len2=b.size()-1;
        int flag=0;
        while(len1>-1&&len2>-1)
        {
            int sum=flag+(a[len1--]-'0')+(b[len2--]-'0');
            s+=char ((sum)%10+'0');
            flag=sum/10;
        }
        while(len1>-1)
        {
            int sum=flag+(a[len1--]-'0');
            s+=char ((sum)%10+'0');
            flag=sum/10;
        }
        while(len2>-1)
        {
            int sum=flag+(b[len2--]-'0');
            s+=char ((sum)%10+'0');
            flag=sum/10;
        }
        if(flag)
            s+=char('0'+flag);
        int len=s.size()-1;
        while(len>-1)
        {
            if(s[len]!='0')
                break;
            s=s.substr(0,s.size()-1);
            len--;
        }
        for(int i=0;i<s.size()/2;i++)
        {
            char c=s[i];
            s[i]=s[s.size()-i-1];
            s[s.size()-i-1]=c;
        }
        if(s.size()==0)
            s+='0';
        return s;
    }
     
     
    string mul(string a,string b)//需要用到大数加
    {
        string s;
        int len1=a.size();
        int len2=b.size();
        for(int i=0;i<len2;++i)
        {
            int num=b[len2-i-1]-'0';
            int len=len1-1;
            int flag=0;
            string temp="";
            while(len>-1)
            {
                int sum=flag+(a[len--]-'0')*num;
                temp+=char ((sum)%10+'0');
                flag=sum/10;
            }
            if(flag)
                temp+=char('0'+flag);
            len=temp.size();
            for(int j=0;j<len/2;j++)
            {
                char c=temp[j];
                temp[j]=temp[len-j-1];
                temp[len-j-1]=c;
            }
            for(int j=0;j<i;++j)
                temp+='0';
            s=add(s,temp);
        }
        return s;
    }

public:
    string multiply(string num1, string num2) {
        return mul(num1,num2);
    }
};

解题思路2:

自己手动实现了一下,不用大数加法,用ans来表示结果,每次相乘最多为91,也就是两位,低位和高位,把这两位加到对应位置就行。
需要注意一直进位问题就行

class Solution {
public:
    string multiply(string num1, string num2) {
        int len1=num1.length(),len2=num2.length();
        if((len1==1&&num1[0]=='0') || (len2==1&&num2[0]=='0'))
            return "0";
        if(len1<len2) {
            swap(num1,num2);
            swap(len1,len2);
        }
        //cout<<"num1="<<num1<<endl;
        //cout<<"num2="<<num2<<endl;

        int ans[405]={0};
        for(int i=len2-1;i>=0;--i) {
            int x=num2[i]-'0';
            for(int j=len1-1;j>=0;--j) {
                int y=num1[j]-'0';
                int sum=x*y;        //最多81,加到ans上去
                int loc=(len2-i-1)+(len1-j-1);   //低位开始位置
                ans[loc]+=sum%10;
                while(ans[loc]>=10) {
                    ans[loc]%=10;
                    ans[loc+1]+=1;
                    ++loc;
                }
                loc=len2-i+(len1-j-1);   //高位开始位置
                ans[loc]+=sum/10;
                while(ans[loc]>=10) {
                    ans[loc]%=10;
                    ans[loc+1]+=1;
                    ++loc;
                }
            }
        }

        string ret="";
        bool flag=false;
        for(int i=402;i>=0;--i) {
            if(ans[i]>0)
                flag=true;
            if(flag) {
                char c=ans[i]+'0';
                ret+=c;
            }
        }
        return ret;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值