题解 | #大数加法#

大数加法

https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475

#include <cstdlib>
#include <string>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        // write code here
        string result = "";
        int i = s.length()-1;
        int j = t.length()-1;
        int carry = 0;

        while (i>=0 || j>=0) {
            int digit1 = (i >= 0) ? (s[i]) - '0' : (0);
            int digit2 = (j>=0) ? (t[j]) - '0' : (0);
            int sum = digit1 + digit2 + carry;
            carry = sum / 10;
            sum %= 10;
            result = std::to_string(sum) + result;
            i--;
            j--;
        }
        if (carry!=0) {
            result = std::to_string(carry) + result;
        }
        return result;
    }
};

因为大数的位数很长,最长可有1e6个数,因此单纯使用std:stoi(string s),由于int类型过长,将会导致转换错误, std::atol(char* s)也是同理。

所以采用将两个字符串从最低位置去除字符,并转换成对应的int类型数字求和,并记录进位carry,在次最低位进行求和,直至两个字符串都求和至最后一位。

其中有一个小技巧:’58‘这样一个字符串,赋值给int类型的变量中,应当使用'58' - '0', 与'0'这个字符做差,则可以得到该数字字符对应的int大小。

接着将sum后的数值,对10取余,作为当前位的数字,并使用std::to_string(int val)转化为字符,并与result字符串通过+符号拼接在一起。

当加到最后时,将进位作为最后一位的字符,与结果拼接在一起。

全部评论

相关推荐

我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务