Leetcode Problem43

43 篇文章 0 订阅

Multiply Strings

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

问题解决:首先我想到的是用最基本的方法来做,即像人工做算术题一样。比如说25*25,那我们首先计算25*5,将得到的值存储在tmp里面(如果该值大于等于10,则保留其个位数,进位由jw来保存)。res在相应的位置上加上tmp的值(不过tmp在res中的位置由乘数决定,比如说5是个位,那么tmp从res的个位开始存储)。接下来轮到十位上的数值5,步骤与前面一致。最后如果有进位,要将进位作为结果的最高位储存起来。由于存储的格式,我把将字符串颠倒了一下。

class Solution {
public:
    string multiply(string num1, string num2) {
        int len1=num1.length(),len2=num2.length();
    int len=len1+len2+1;
    //将字符串颠倒
    reverse(num1.begin(),num1.end());
    reverse(num2.begin(),num2.end());
    char res[len],tmp[len];
    for(int i=0;i<len;i++)
    {
        res[i]='0';     
        tmp[i]='0';
    }
    for(int i=0;i<len1;i++)
    {
        int jw=0,r_jw=0;
        for(int j=0;j<len2;j++)
        {
            tmp[j]=((num1[i]-'0')*(num2[j]-'0')+jw)%10+'0';
            int res_temp=(res[j+i]-'0')+(tmp[j]-'0')+r_jw;
            res[j+i]=res_temp%10+'0';
            jw=((num1[i]-'0')*(num2[j]-'0')+jw)/10;
            r_jw=res_temp/10;
        }
        if(r_jw!=0||jw!=0)
        {
            res[len2+i]=jw+r_jw+'0';        
        }
    }
    string result="";
    bool flag=false; //代表还没遇到整数
    for(int i=len-1;i>=0;i--)
    {
        if(res[i]!='0'&&!flag)
        {
            result+=res[i];
            flag=true;
        }
        else if(flag)
            result+=res[i];
    }
    //reverse(res.begin(),res.end());
    if(result=="") result="0";
    return result;
    }
};

beats 27.49 % of cpp submissions.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值