
 
刷题
- Leetcode 415 字符串相加
- 题目描述
 
- 思路一(模拟大法版!!!)
- Leetcode 34 字符串相乘
- 题目描述
 
- 思路一(模拟大法版)
- Thanks♪(・ω・)ノ谢谢阅读!!!
- 下一篇文章见!!!
Leetcode 415 字符串相加
题目描述

 逻辑很简单,对应位置相加,并进位即可。
思路一(模拟大法版!!!)
本题我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是将相同数位对齐,从低到高逐位相加,如果当前位和超过 10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。
class Solution {
public:
    string addStrings(string num1, string num2) {
    int carry = 0;
    string::reverse_iterator it1 = num1.rbegin() ;
    string::reverse_iterator it2 = num2.rbegin() ;
    string res = "";
    while (it1 != num1.rend() || it2 != num2.rend() || carry) {
        int n1 = 0, n2 = 0;
        if (it1 != num1.rend()) {
            n1 = *it1 - '0';
            it1++;
        }
        if (it2 != num2.rend()) {
            n2 = *it2 - '0';
            it2++;
        }
        int result = n1 + n2 + carry;
        res += (result % 10) + '0';
        carry = result / 10;
    }
    reverse(res.begin(), res.end());
        return res;
    }
};
来看效果:
 
 非常好!!!!!!
 过啦!!!!!!!!
Leetcode 34 字符串相乘
题目描述

 根据描述,这道题实际上就是模拟一下乘法运算,这是又又又用到了乘法器原理(实际上就是竖式运算),不得不说竖式运算真的是神!!!如果要用竖式乘法就要分布相乘,然后在加到一起,这时又会用到字符串相加的知识。所以这道题可谓一箭双雕。该题的难点应该是如何保证模拟过程的顺利进行。
思路一(模拟大法版)
- 两个乘数选择其一进行逐个相乘操作
- 每次相乘获得一个数 并 对应相对的数量级
- 每次相加到一起
 这样就完成我们的操作。
如果num和num2之一是0,则直接将0作为结果返回即可。
如果num和num2都不是0,则可以通过模拟「竖式乘法」的方法计算乘积。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被乘数是 num,乘数是num2。
需要注意的是,num2除了最低位以外,其余的每一位的运算结果都需要补0。
 我们进行一下图解:
 
 这样就看见进行我们的代码编写工作了!!!
 干就完了! 如果看不出错误请在VS中进行调试哦!
class Solution {
public:
	//求和函数
    string addStrings(string num1, string num2) {
		//进位
        int carry = 0;
		//迭代器版
        string::reverse_iterator it1 = num1.rbegin();
        string::reverse_iterator it2 = num2.rbegin();
        string res = "";
		//加完为止
        while (it1 != num1.rend() || it2 != num2.rend() || carry) {
		// 进行计算
            int n1 = 0, n2 = 0;
            if (it1 != num1.rend()) {
                n1 = *it1 - '0';
                it1++;
            }
            if (it2 != num2.rend()) {
                n2 = *it2 - '0';
                it2++;
            }
            // 结果
            int result = n1 + n2 + carry;
			//该位置 为结果取余数
            res += (result % 10) + '0';
            //进位
            carry = result / 10;
        }
		//不要忘记反转!!!
        reverse(res.begin(), res.end());
        return res;
    }
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        //乘数1 
        int p1 = num1.size() - 1;
        string ans = "0";
        while (p1 >= 0) {
            //乘数2
            int p2 = num2.size() - 1;
            //开始乘  
            //数字 1  进位数  结果
            int carry = 0; string tmp = "";
            while (p2 >= 0 || carry) {
				//进行计算
                int n1 = 0, n2 = 0;
                if (p1 >= 0) {
                    n1 = num1[p1] - '0';
                }
                if (p2 >= 0) {
                    n2 = num2[p2] - '0';
                    p2--;
                }
				//该步的结果
                int result = n1 * n2 + carry;
                tmp += result % 10 + '0';
                carry = result / 10;
            }
			//不要忘记反转!!!
            reverse(tmp.begin(), tmp.end());
            //对应数量级一定要搞清楚
            for (int i = 0; i < num1.size() - p1 - 1; i++) {
                tmp += '0';
            }
            //加到答案中
            ans = addStrings(ans, tmp);
            p1--;
        }
        return ans;
    }
};
来看效果:
 
顺利通过!!!
 为我们鼓掌!!!!!!!
 送给大家一句我非常喜欢的名言:
 我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。——山本耀司





![基于51单片机的定时器时钟设计[proteus仿真]](https://img-blog.csdnimg.cn/direct/60d7f9d236c7413ab0e32ce0e2eddae8.png)



![[C/C++]string类常用接口介绍及模拟实现string类](https://img-blog.csdnimg.cn/direct/367e962274e24e46ba2abeee0f0bf148.png)



![[QT]自定义的QtabWidget](https://img-blog.csdnimg.cn/direct/52ed24c0306e4ea8a3846f376dfcb375.gif)





