【打卡】牛客网:BM86 大数加法

本文介绍了一种处理大数字符串加法的方法,避免了直接转换为整数相加,通过模拟加法过程,包括反转字符串、处理不同长度和进位,使用int和char转换以及string之间的转换来完成计算。
摘要由CSDN通过智能技术生成

题目分析:

因为是大数,所以不能:将string转为int,进行相加后,再int转为string。

而是直接模拟加法过程。

我写的:

一些细节:

  1. 需要反转。因为字符串从左到右遍历,加法从右往左遍历。
  2. 处理不同长度的字符串时,
    1. 法一:短的字符串补充‘0’
    2. 法二:相同位数先进行相加,再对长的字符串进行进位处理。(我采用)
  3. 本题用到:int和char之间的转换:
    1. int转char,用char = int + '0'
    2. char转int,用int = char - '0'
  4. 此外,补充int和string之间的转换:
    1. int转string,用string = to_string(int)
    2. string转int,用int = stoi(string)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        int n1 = s.size();
        int n2 = t.size();
        if(n1 == 0)
            return t;
        if(n2 == 0)
            return s;
        
        reverse(s.begin(), s.end());
        reverse(t.begin(), t.end());

        int n; //取小的
        string ans; //取长的
        if(n1 < n2){
            n = n1;
            ans = t;
        }
        else{
            n = n2;
            ans = s;
        }

        int flag = 0;
        //相同部分
        for(int i = 0; i < n; i++){
            int temp = s[i] - '0' + t[i] - '0' + flag;
            flag = temp / 10;
            temp = temp % 10;
            ans[i] = temp + '0';
        }

        //多出部分
        for(int i = n; i < ans.size(); i ++){
            int temp = ans[i] - '0' + flag;
            flag = temp / 10;
            temp = temp % 10;
            cout<<temp<<endl;
            ans[i] = temp + '0';
        }
        
        //最后,如果进位flag还是1,还需要
        if(flag == 1)
            ans = ans + "1"; //string可以直接用“+”拼接
        
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

模板的:

 值得采用的点:

  1. if(s长度<t长度) swap(s,t),从而保证s为长的,t为短的。
    1. 我另外定义了一个string ans = 二者中长的字符串。
  2. 一个for循环搞定,遍历长的字符串。在for循环内部,判断短的字符串是否有值,如果有值,让temp累加即可。
    1. 我用了两个for循环。
  3. 模板没有用反转,所以在取下标的时候比较麻烦。
    1. 我用了反转,更简单。但是速度会慢一些。

 

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值