刷题
- 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) {//乘数2int 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;}
};
来看效果:
顺利通过!!!
为我们鼓掌!!!!!!!
送给大家一句我非常喜欢的名言:
我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。——山本耀司