C++从零开始的打怪升级之路(day15)

发布时间:2024年01月19日

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的内容是string类,明天开始学习string的模拟实现

1.字符串相加

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定两个字符串形式的非负整数?num1?和num2?,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如?BigInteger),?也不能直接将输入的字符串转换为整数形式

在实际运用中由于整形大小有限制,我们可以用字符串来存储数据

这题要实现字符串的加法,首先我们把个数对齐,逐次向上取数据,要注意的是两个数据可能一个比另一个长,我们用0来代替,最后还要注意会不会最后一位进位

class Solution {
public:
    string addStrings(string num1, string num2) 
    {
        string retstr;
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        
        int next = 0;
        while(end1 >= 0 || end2 >= 0)
        {
            int n1 = 0;
            int n2 = 0;
            if(end1 >= 0)
                n1 = num1[end1] - '0';
            if(end2 >= 0)
                n2 = num2[end2] - '0';

            int num = n1 + n2 + next;
            if(num >= 10)
            {
                num -= 10;
                next = 1;
            }
            else
            {
                next = 0;
            }
            
            retstr.push_back(num + '0');

            end1--;
            end2--;
        }

        if(next == 1)
        {
            retstr.push_back('1');
        }

        reverse(retstr.begin(),retstr.end());

        return retstr;
    }
};

这是ac代码

2.字符串相乘

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定两个以字符串形式表示的非负整数?num1?和?num2,返回?num1?和?num2?的乘积,它们的乘积也表示为字符串形式

这题相当于上面字符串相加的升级版

思路:一个字符串不变,另一个字符串从后向前遍历,实现一个字符与字符串相乘的函数,通过控制来达到两个字符串相乘的函数,当然对于有0参与的乘法记得特判

class solution {
public:
    static string addStrings(string num1, string num2) 
    {
        string retstr;
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        
        int next = 0;
        while(end1 >= 0 || end2 >= 0)
        {
            int n1 = 0;
            int n2 = 0;
            if(end1 >= 0)
                n1 = num1[end1] - '0';
            if(end2 >= 0)
                n2 = num2[end2] - '0';

            int num = n1 + n2 + next;
            if(num >= 10)
            {
                num -= 10;
                next = 1;
            }
            else
            {
                next = 0;
            }
            
            retstr.push_back(num + '0');

            end1--;
            end2--;
        }

        if(next == 1)
        {
            retstr.push_back('1');
        }

        reverse(retstr.begin(),retstr.end());

        return retstr;
    }
};

class Solution {
public:
    string _multiply(string s,char ch)
    {
        string retstr;
        int num = ch - '0';
        int end = s.size() - 1;
        int next = 0; 
        while(end >= 0)
        {
            int n = num * (s[end] - '0') + next;
            next = 0;
            while(n >= 10)
            {
                n -= 10;
                ++next;
            }

            retstr.push_back(n + '0');

            end--;
        }

        if(next) 
            retstr.push_back(next + '0');
        
        reverse(retstr.begin(),retstr.end());
        return retstr;
    }

    string multiply(string num1, string num2) 
    {
        string s0 = "0";
        if(num1 == "0" || num2 == "0")
            return s0;
        string retstr;
        int begin = 0;
        while(begin < num2.size())
        {
            string s = _multiply(num1,num2[begin]);
            retstr.push_back('0');
            retstr = solution::addStrings(retstr,s);

            begin++;
        }

        return retstr;
    }
};

这是ac代码

今天的博客就到这里了,后续内容明天分享,最近因为考试周原因不能更新太多内容,等考试周结束了再"快马加鞭"

新手第一次写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!!

文章来源:https://blog.csdn.net/2301_80764270/article/details/135707169
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。