【每日挠头算法(4)】字符串相加|字符串相乘

这篇具有很好参考价值的文章主要介绍了【每日挠头算法(4)】字符串相加|字符串相乘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、字符串相加

点我直达~

【每日挠头算法(4)】字符串相加|字符串相乘

思路:模拟竖式加法

  • 1.将两个字符串从右往左开始进行相加,使用一个变量ans表示进位,如果两个字符串的个位加法和大于10,那么让进位+1,个位和再%10,然后将结果存入到新的字符串strRet
  • 2.两个字符串的十位和十位继续相加,并且需要加上个位的进位ans,步骤同1
  • 3.这样不断相加,假如任意一个字符串的位数加完了,另一个字符串的位数未加完,比如:123+11,那就将该字符串连同上一位的进位ans加上并复制到新的字符串strRet中,注意,在代码的计算时,应该是123+011,11前面的’0’是需要补位的
  • 4.最后将strRet逆置即可得到我们想要的结果。

具体代码如下:

写法1:

class Solution {
public:

    string addStrings(string num1, string num2)
    {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        string strRet;
        int ans = 0;

        while (end1 >= 0 && end2 >= 0)
        {
            int sum = (num1[end1]-'0')+(num2[end2]-'0') + ans;
            strRet += (sum % 10 + '0');
            ans = sum / 10;
            --end1;
            --end2;
        }

        while(end1 >= 0)
        {
            int sum = ((num1[end1] - '0' + ans));
            strRet += ( (sum%10) + '0');
            ans = sum/10;
            --end1;
        }

        while(end2 >= 0)
        {
            int sum = ((num2[end2] - '0' + ans));
            strRet += ( (sum%10) + '0');
            ans = sum/10;
            --end2;
        }

        if(ans!=0)
        {
            strRet +=( ans + '0');
        }

        reverse(strRet.begin(), strRet.end());
        return strRet;
    }
};

写法2:

class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        string ans = "";
        while (i >= 0 || j >= 0 || add != 0) 
        {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int result = x + y + add;
            ans.push_back('0' + result % 10);
            add = result / 10;
            i -= 1;
            j -= 1;
        }
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

二、字符串相乘

点我直达~

【每日挠头算法(4)】字符串相加|字符串相乘

思路:模拟竖式乘法

字符串相乘的思路与字符串相加的思路类似

  • 1.任意取一个字符串作为被乘数,如果该字符串的长度比另一个字符串短,则需要在不足的位数上补’0’
  • 2.两个字符串从个位开始相乘,所得结果如果大于10,则使用变量ans来保存进位,然后将个位的乘积%10,结果保存到新的字符串strRet中。
  • 3.继续重复2.的过程,在此期间如果任意一个字符串的长度遍历完了, 那么就将另一个字符串的剩余的位数+进位ans复制保存到strRet新的字符串中。这个相加的过程可以调用字符串想加的函数完成。
  • 4.最后逆置strRet字符串即可得到我们想要的结果。

具体代码如下:

class Solution {
public:
    //将其中一个作为被乘数,将每一位拆分出来进行相乘,然后把结果累计起来
    //其中,被乘数的位数如果大于2位,需要先提前加上0
    string multiply(string num1, string num2) 
    {
       string strret;
       if(num2[0] == '0' || num1[0] == '0')
       {
           return strret+='0';
       }
       int end1 = num1.size() -1;
       int end2 = num2.size() -1;

       for(int i = end2;i>=0;--i)
       {
           string cur;
           int add = 0;
           //num2是被乘数,需要补0
           for(int j = end2;j>i;--j)
           {
               cur+='0';
           }

            //开始计算乘积
            for(int j = end1;j>=0;--j)
            {
                int val1 = (num1[j]-'0');
                int val2 = (num2[i]-'0');
                int sum = val1*val2+add;
                cur+=(sum%10 + '0');
                add = sum/10;
            }

            //这里如果进位不等于0,还要把进位加上
            if(add!=0)
            {
                cur+=(add + '0');
            }
            //计算结果需要逆置
            reverse(cur.begin(),cur.end());

            //然后累加起来
            strret = addStrings(strret,cur);
       }
        return strret;
    }

        string addStrings(const string &num1, const string &num2) 
        {
            int i = num1.length() - 1, j = num2.length() - 1, add = 0;
            string ans = "";
            while (i >= 0 || j >= 0 || add != 0) {
                int x = i >= 0 ? num1[i] - '0' : 0;
                int y = j >= 0 ? num2[j] - '0' : 0;
                int result = x + y + add;
                ans.push_back('0' + result % 10);
                add = result / 10;
                i -= 1;
                j -= 1;
        }
        
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

总结

通过写今天的字符串相加|字符串相乘,我大致学会了如何将字符串转化为竖式的方法进行相加/相乘。文章来源地址https://www.toymoban.com/news/detail-483543.html

到了这里,关于【每日挠头算法(4)】字符串相加|字符串相乘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode·每日一题·415. 字符串相加·模拟

    作者:小迅 链接:https://leetcode.cn/problems/add-strings/solutions/2347085/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-fges/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   题意 - 给定二个字符串,计算它们的和并同样以字符串形式返回。 直接从

    2024年02月16日
    浏览(30)
  • 【力扣每日一题】2023.7.17 字符串相加

    题面很简单,就是要将两个字符串看作是数字然后相加,将最后结果转为字符串返回即可. 看到这题我的第一反应是直接转成数字再相加再转成字符串,像是这样: 但这样就不符合题目要求了( 这不是主要原因 ) ,并且遇到大数就无法转成整型也无法计算了. 所以需要像是我们列竖式

    2024年02月16日
    浏览(23)
  • 【算法详解】力扣415.字符串相加

    力扣链接:力扣415.字符串相加 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1: 输入:num1 = “11”, num2 = “123” 输出:

    2024年01月22日
    浏览(31)
  • 【每日算法】【205. 同构字符串】

    ☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝,如有错误请指正 📆 未来很长,值得我们全力奔赴更美好的生活✨ 老规矩,先介绍一下 Unity 的科

    2024年02月11日
    浏览(32)
  • LeetCode —— 43. 字符串相乘

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–C++🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一下博主

    2024年02月20日
    浏览(26)
  • leetcode 43.字符串相乘

    🌟 leetcode链接:字符串相乘 思路: 代码:

    2024年02月09日
    浏览(24)
  • 如何高效解决“字符串相乘“问题?

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 金句分享: ✨你要狠下心来去努力,努力变成一个很厉害的人.✨ 本题牛牛写了很久,起初对每次相乘的结果就进位处理了,最后还需要考虑 错位相

    2024年02月12日
    浏览(28)
  • LeetCode 43题:字符串相乘

    给定两个以字符串形式表示的非负整数  num1  和  num2 ,返回  num1  和  num2  的乘积,它们的乘积也表示为字符串形式。 注意: 不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 示例 2: 提示: 1 = num1.length, num2.length = 200 num1  和  num2  只能由数字组成。

    2024年02月11日
    浏览(26)
  • 【string题解 C++】字符串相乘 | 翻转字符串III:翻转单词

    目录 字符串相乘 题面 错误记录 Way1 拆分成“先乘后加” 思路 实现 时空复杂度分析 反思 Way2 用数组 思路 实现 时空复杂度分析 翻转字符串III:翻转字符串中的单词 题面 错误记录 思路1 遍历找单词 实现 思路2 暴力解法 实现 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平

    2024年02月07日
    浏览(48)
  • LeetCode_字符串_简单_415.字符串相加

    给定两个字符串形式的非负整数 num1 和num2,计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。 示例 1: 输入:num1 = “11”, num2 = “123” 输出:“134” 示例 2: 输入:num1 = “

    2024年02月01日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包