【每日挠头算法(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;
    }
};

二、字符串相乘

点我直达~

思路:模拟竖式乘法

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

  • 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;
    }
};

总结

通过写今天的字符串相加|字符串相乘,我大致学会了如何将字符串转化为竖式的方法进行相加/相乘。

相关文章
|
4月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
2月前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
97 1
两个字符串匹配出最长公共子序列算法
|
4月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
5月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
312 1
|
5月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
140 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
90 0
|
5月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
6月前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集
|
6月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之暴力匹配
Java数据结构与算法:字符串匹配算法之暴力匹配
|
6月前
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法
下一篇
DataWorks