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.

这个题目看似是两个数的乘法,但我们并不能通过转换类型的方式来直接乘,因为用字符串存储是不存在位数限制的。因此只能做字符串单个位的处理。我用加法模拟乘法的方法,先求出num2中每一位数字与num1相乘的结果,然后再把这个结果累加到result中,代码如下:

class Solution {
public:
    string multiply(string num1, string num2) {
        string result="0";
        if(num1=="0" || num2=="0") //有0直接返回
            return result;
        char c;
        for(int i=num2.size()-1;i>=0;i--){
            int m=num2[i]-'0';
            string s=mul(num1,m);
            //相加前确定该结果所在的位置,在后面补0
            for(int j=i+1;j<num2.size();j++) 
                s=s+'0';
            result=sum(result, s);
        }
        return result;
    }
    string mul(string s1, int n){ //单个数字与num1字符串相乘
        int carry=0; //进位标志
        string sout;
        for(int i=s1.size()-1;i>=0;i--){
            int tmp=s1[i]-'0';
            int m=tmp*n+carry;
            carry=m/10;
            m=m%10;
            char c='0'+m;
            sout=c+sout;
        }
        if(carry>0){
            char f='0'+carry;
            sout=f+sout;
        }

        return sout;
    }
    string sum(string s1, string s2){  //结果累加
        //把s1和s2字符串的位数补成相同,短的字符串前面补0
        while(s1.size()<s2.size()){
            s1='0'+s1;
        }
        while(s2.size()<s1.size()){
            s2='0'+s2;
        }
        int carry=0;  //进位标志
        string sout;
        for(int i=s1.size()-1;i>=0;i--){
            int tmp1=s1[i]-'0';
            int tmp2=s2[i]-'0';
            int tsum=tmp1+tmp2+carry;
            carry=tsum/10;
            tsum=tsum%10;
            char c='0'+tsum;
            sout=c+sout;
        }
        if(carry>0){
            char f='0'+carry;
            sout=f+sout;
        }
        return sout;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值