[leetcode]415. 字符串相加 与 43. 字符串相乘

415. 字符串相加

43. 字符串相乘

415. 字符串相加

题解思路:

大数相加无非就是每个位的数先相加,然后把对应的进位补齐

图解:

 

步骤:

1.先得到两个数的位数,并且创造一个string ret位数比两个string中最大的位数再大一位

2.拿的最后的位的位置,并且两个string都需要一个临时的int类型来存储拿下来的数进行加法,还要有一个int类存储下一个位置是否要进位

3.设计一个循环,直到两个string所有值被遍历过一遍,我们从最后位算起,为了效率选择尾插,但是我们要知道ret最后得到的数是完全倒过来的

4.循环里,要明确string中拿下来的数是什么,写一个三目判断,如果取的位置还在string范围里,则取的位置往前移动,取的数塞到end里;如果取的位置不在string里了,说明string的数取完了,那就对应是取0了

5.将end的数相加并且加上进位值,得到的sum再/10得到的值给进位用于下一次两end相加时加上;sum也要%10再存到开辟的string里

6.循环结束,看看是否还要剩余的进位,如果有则加1尾插string中

7.reverse一下ret,输出ret

代码: 

class Solution {
public:
    string addStrings(string num1, string num2) {
        int size1 = num1.size()-1;
        int size2 = num2.size()-1;
        int end1=0,end2=0,tmp = 0;
        string ret;
        int max = (size1>=size2)?size1:size2;
        ret.reserve(max+1);
        while(size1>=0||size2>=0)
        {
            end1=(size1>=0)?(num1[size1--]-'0'):0;
            end2=(size2>=0)?(num2[size2--]-'0'):0;
            int sum = end1+end2+tmp;
            tmp=sum/10;
            sum%=10;
            ret+=sum+'0';
        }
        if(tmp==1)
            ret+='1';
        reverse(ret.begin(),ret.end());
        return ret;
    }
};

43. 字符串相乘

解题思路:(需要用到大数加法的函数)
在我看来,乘法就可用被看成一大堆二数相乘后再进行数的加法

图片演示:

 

步骤:

1.确定是循环两层
2.在循环中,用一个tmp记录每次两数相乘的结果,需要注意减去‘0’
3.在循环里建立一个临时的string s
4.需要把tmp和后面要加对应的0导入s中,我们能知道每次循环需要添加size1+size2-i-j个零。首先把这么多个0加到s中,然后倒着把tmp导入到s中,由于s在这个过程是倒着记录的,所以最后还要reverse逆置回来
5.把每次最后得到的s加到ret中

代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int size1 = num1.size() - 1;
        int size2 = num2.size() - 1;
        int end1 = 0, end2 = 0, tmp = 0;
        string ret;
        int max = (size1 >= size2) ? size1 : size2;
        ret.reserve(max + 1);
        while (size1 >= 0 || size2 >= 0)
        {
            end1 = (size1 >= 0) ? (num1[size1--] - '0') : 0;
            end2 = (size2 >= 0) ? (num2[size2--] - '0') : 0;
            int sum = end1 + end2 + tmp;
            tmp = sum / 10;
            sum %= 10;
            ret += sum + '0';
        }
        if (tmp == 1)
            ret += '1';
        reverse(ret.begin(), ret.end());
        return ret;
    }
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0")
            return "0";
        string ret;
        int tmp = 0,i=0,j=0;
        size_t size1 = num1.size() - 1;
        size_t size2 = num2.size() - 1;
        for (i = size1; i >= 0; i--)
        {
            for (j = size2; j >= 0; j--)
            {
                string s;
                tmp=(num1[i]-'0')*(num2[j]-'0');
                for(int k=0;k<size1+size2-i-j;k++)
                {
                    s+="0";
                }
                while(tmp)
                {
                    s+=(tmp%10+'0');
                    tmp/=10;
                }
                reverse(s.begin(),s.end());
                ret=addStrings(ret,s);
            }
        }
        return ret;
    }
};

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灼榆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值