(C++)字符串相乘

个人主页:Lei宝啊

愿所有美好如期而遇


题目链接如下:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode-cn.com/problems/multiply-strings/description/

题目

思路

我们首先不能将字符串全部转换为数字,因为存储不下,而且注意也不允许,所以我们应该想到用一个字符串尾部的单位乘一个字符串,然后存储得到的字符串,再由尾部的倒数第二位乘,再存储结果字符串,并且根据位数在结果字符串后补0,最终得到的所有结果字符串相加,就是我们的答案。

字符串相加:(C++)字符串相加

图解

代码

string multiply(string num1, string num2) 
    {
        if(num1 == "0" || num2 == "0")
        {
            return "0";
        }

        int s1 = num1.size();
        int s2 = num2.size();

        if(s1 > s2)
        {
            num1.swap(num2);
            s1 = num1.size();
            s2 = num2.size();
        }

        int count = 0;
        string s[201];
        for(int i=s1-1; i>=0; i--)
        {

            int ch1 = num1[i] - 48;
            int add = 0;

            for(int j=s2-1; j>=0; j--)
            {
                int ch2 = num2[j] - 48;
                s[i] += ch2 * ch1 % 10 + 48 + add;
                add = ch2 * ch1 / 10;     
            }
            if(add > 0)
            {
                s[i] += add + 48;
            }
            reverse(s[i].begin(),s[i].end());

            for(int k=0; k<count; k++)
            {
                s[i] += '0';
            }
            count++;
        }

        string result;
        for(int i=0; i<s1; i++)
        {
            result = addStrings(result,s[i]);
        }

        return result;
    }

string addStrings(string num1, string num2) 
    {
        string result;
        int next = 0;
 
        char tmp1 = 0;
        char tmp2 = 0;
 
        while(!num1.empty() || !num2.empty())
        {
            if(!num1.empty())
                tmp1 = num1[num1.size()-1] - 48;
            else
                tmp1 = 0;
 
            if(!num2.empty())
                tmp2 = num2[num2.size()-1] - 48;
            else
                tmp2 = 0;
 
            int sum = tmp1 + tmp2 + next;
            next = sum / 10;
            sum %= 10;
 
            result += (sum+48);
 
            if(!num1.empty())
                num1.erase(num1.end()-1);
            if(!num2.empty())
                num2.erase(num2.end()-1);
        }
 
        if(next > 0)
            result += '1';
 
        reverse(result.begin(),result.end());
        return result;
    }   
相关推荐
幼儿园口算大王5 天前
最简单的难题——游戏英雄升级潜力评估
java·算法·刷题
小殷要努力刷题!1 个月前
每日一刷——1.20——准备蓝桥杯
java·学习·算法·蓝桥杯·刷题·牛客·语法学习
L~river1 个月前
SQL刷题快速入门(三)
数据库·sql·mysql·笔试·刷题
丷从心1 个月前
【刷题】【力扣】【180】【中等】连续出现的数字
力扣·刷题
L~river1 个月前
SQL刷题快速入门(二)
数据库·sql·mysql·算法·笔试·刷题
L~river1 个月前
SQL刷题快速入门(一)
数据库·sql·oracle·笔试·刷题
mafucan2 个月前
VulnHub-Acid(1/100)
linux·安全·渗透测试·靶场·刷题·vulnhub
邂逅岁月2 个月前
滑不动窗口的秘密—— “滑动窗口“算法 (Java版)
算法·面试·求职招聘·创业创新·刷题
misty youth4 个月前
15-7数字字符串格式化
python·算法·刷题·python刷题
misty youth4 个月前
15-4连续子串和的整除问题
python·算法·刷题·python刷题