LeetCode —— 43. 字符串相乘

在这里插入图片描述

‍️‍️‍️‍️Take your time ! ‍️‍️‍️‍️
个人主页:大魔王
所属专栏:魔王的修炼之路–C++
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞关注,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。

43. 字符串相乘

这个相当于是字符串相加的进阶版,需要用到字符串相加实现的内容。

几个月前做过一遍都做了好几个小时,这次又做有用了好几个小时
之前的思路是每次用完数据pop,这次的实现是通过对迭代器的控制
花了三四个小时,无语了,总结出来就两个大问题:

  1. 对于任何情况的位数0都不应该在转换为int时去管,因为整形的存储空间就那么大,但是字符串可以无限大,所以就算不算数据部分,对于比较长的字符串最后也会把整型给撑爆,long long也不行,解决方法就是先将这一次要加的0记起来然后等要计算这次字符串相加时也就是把整型转换为了字符串时再补上这一次的0.
  2. 不能先将其中一个字符串转换为整型然后只用一层for循环对另一个字符串的数据进行遍历相加,就算是long long也接收不了每次这么大的整型,必须用两层for循环分别让两个数的每位相乘完立即相加到字符串上。

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
提示:
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零,除了数字0本身。

class add {
public:
    string addStrings(string num1, string num2) {
        string s;
        int n1 = 0, n2 = 0;
        int flag = 0;
        int sum = 0;
        if (num1.size() == 0)
            return num2;
        else if (num2.size() == 0)
            return num1;
        string::iterator cur1 = num1.end() - 1;
        string::iterator cur2 = num2.end() - 1;
        while (cur1 >= num1.begin() || cur2 >= num2.begin())
        {
            n1 = cur1 >= num1.begin() ? *cur1 - '0' : 0;
            n2 = cur2 >= num2.begin() ? *cur2 - '0' : 0;//等到越界的时候也没事,因为三目操作符会选择性执行,只会去比那块的地址,不会访问进去。
            sum = n1 + n2 + flag;
            flag = 0;
            if (sum > 9)
            {
                flag = 1;
                sum -= 10;
            }
            s += sum + '0';
            cur1--;
            cur2--;
        }
        if (flag)
            s += 1 + '0';
        reverse(s.begin(), s.end());
        return s;
    }
};

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == string("0") || num2 == "0")
            return string("0");
        string s;
        long long num1_tmp = 0;
        long long num2_tmp = 0;
        //不能一下子让num1变为整数,因为就算是long long 也存不下,所以要套两层循环,让它们每个位都相乘
        // for (auto x : num1)
        // {
        //     cout << (x - '0') << ' ';
        //     s_num1 += (x - '0') * pow(10, num1.size() - 1 - system++);
        //     cout << s_num1 << endl;
        // }
        // cout << s_num1 << endl;
        int system1 = 0;
        int system2 = 0;
        string::iterator it1 = num1.end() - 1;

        while(it1 >= num1.begin())
        {
            system2 = 0;
            string product_s;
            num1_tmp = *it1 - '0';
            string::iterator it2 = num2.end() - 1;
            while(it2 >= num2.begin())
            {
                int system = system1 + system2;
                int product = 0;
                num2_tmp = *it2 - '0';
                product = num1_tmp * num2_tmp;
                while (product > 9)
                {
                    int n = product % 10;
                    product_s += n + '0';
                    product /= 10;
                }
                product_s += product + '0';
                reverse(product_s.begin(), product_s.end());
                for(int i = 0; i < system; i++)
                    product_s += '0';
                
                // cout << s << endl;
                // cout << product_s << endl;
                s = add().addStrings(s,product_s);
                // cout << s << endl;
                product_s.clear();
                system2++;
                it2--;
            }
            system1++;
            it1--;
        }
        return s;
    }
};
  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

专栏推荐
魔王的修炼之路–C语言
魔王的修炼之路–数据结构初阶
魔王的修炼之路–C++
魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

你可能感兴趣的:(力扣题目汇总,leetcode,算法,c++)