为了账号安全,请及时绑定邮箱和手机立即绑定

Leetcode-43 划水记录06 大数乘法

标签:
C++


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

示例 1:

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

输出: "6"

示例 2:

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

输出: "56088"

说明:

num1 和 num2 的长度小于110。

num1 和 num2 只包含数字 0-9。

num1 和 num2 均不以零开头,除非是数字 0 本身。

不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

我的实现方法是模拟两个数乘法的竖式计算,但是速度好像不怎么好

string multiply(string num1, string num2) {

    int len1 = (num1).size();

    int len2 = (num2).size();

    string pLong = len1>len2?num1:num2;

    string pShor = len1<=len2?num1:num2;

    map<int,vector<int>> iRes;

    for (int iXhbl=pShor.size()-1;iXhbl>=0;iXhbl--)

    {

        int iCarry = 0;//进位控制

        string iResult;

        for (int iXhbl2=pLong.size()-1;iXhbl2>=0;iXhbl2--)

        {

            int iSum=0;

            if (iCarry)

            {

                iSum += iCarry;

                iCarry = 0;

            }

            iSum += (pLong[iXhbl2] - '0')*(pShor[iXhbl]-'0');

            if (iSum >= 10)

                iCarry = iSum/10;

            iResult +=( iSum % 10)+'0';

            int djw = (pShor.size()-1- iXhbl) + 1 + (pLong.size() - 1 - iXhbl2);

            iRes[djw].push_back((iSum % 10));

        }

        if (iCarry)

        {

            int djw = (pShor.size() - 1 - iXhbl) + 1 + pLong.size();

            iRes[djw].push_back((iCarry ));

            iResult += iCarry + '0';

        }

    }

    int iCarry = 0;

    string iRest;

    for (int iXhbl=1;iXhbl<=pLong.size()+pShor.size();iXhbl++)

    {

        if (iRes[iXhbl].size() > 0)

        {

            int iSum = 0;

            for (int iXhbl2=0;iXhbl2< iRes[iXhbl].size();iXhbl2++)

            {

                iSum += iRes[iXhbl][iXhbl2];

            }

            if (iCarry)

            {

                iSum += iCarry;

                iCarry = 0;

            }

            if (iSum >= 10)

                iCarry = iSum / 10;

                iRest = iRest + (char)((iSum % 10) + '0');

        }

    }

    if (iCarry)

    {

        iRest = iRest + (char)((iCarry % 10) + '0');

    }

    std::reverse(iRest.begin(), iRest.end());

    //去除多余的0

    int zeroNums=0;

    for (int iXh=0;iXh<iRest.size()-1;iXh++)

    {

        if (iRest[iXh] == '0')

        {

            zeroNums++;

        }

        else

            break;

    }

    iRest.erase(0, zeroNums);

    return iRest;

}

©著作权归作者所有:来自51CTO博客作者hzChan的原创作品,如需转载,请注明出处,否则将追究法律责任

大数运算leetcode43C/C++


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消