栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


给定两个以字符串形式表示的非负整数 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> 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

    {

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

        {

            zeroNums++;

        }

        else

            break;

    }

    iRest.erase(0, zeroNums);

    return iRest;

}

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

大数运算leetcode43C/C++


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/232607.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号