C++刷题笔记6

P.S 非科班出身,对C++和算法较陌生,从入门开始,使用的是牛客网平台,刷题借鉴了很多前人的思路,博客仅为记录用。

问题7:大数加法【NC1】

问题描述:以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
数据范围: l e n ( s ) , l e n ( t ) ≤ 100000 len(s),len(t)≤100000 len(s),len(t)100000,字符串仅由’0’~‘9’构成
问题要求:空间复杂度 O ( 1 ) O(1) O(1),时间复杂度 O ( n ) O(n) O(n)
解题思路:首先将两数对齐,这应该有两种思路,第一种是让其中较长的数字作为基础,另外一个数作为进位,在另一个数字的无数字的地方自动判定为零,但是这种方法实现起来相对复杂;第二种是补齐较短的一个,然后依据我们正常做加法的方法,实现两数的加减法,本题解采用第二种办法。
代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int len_s = s.size();
        int len_t = t.size();
        if (!len_s) return t;
        if (!len_t) return s;
        while (len_s != len_t){
            if (len_s > len_t) {
                t = "0" + t;
                len_t++;
            }
            else {
                s = "0" + s;
                len_s++;
            }
        }
        
        int carry = 0;
        int tmp = 0;
        for (int i=len_s-1;i>=0;i--) {
            tmp = (s[i]-'0'+t[i]-'0'+carry);
            if (tmp>=10) {
                s[i] = tmp - 10 + '0';
                carry = 1;
            }
            else {
                s[i] = tmp + '0';
                carry = 0;
            }
            
        }
        
        if (carry) {
            s = '1' + s;
        }
    return s;
    }
};

注意点

  1. tmp = (s[i]-'0'+t[i]-'0'+carry);字符加减法时使用的是ASCII码的数值,需要先减掉0对应的ASCII码值,最终才能得到对应的整数数值;
  2. s = '1' + s;其中s是字符串,这一操作可以在其前插入字符串1,也可以使用s = "1"+ s;

参考资料:

  1. C++ char数据类型(详解版)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值