题解 | #大数加法#
大数加法
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字符串通过+符号拼接在一起。
当加到最后时,将进位作为最后一位的字符,与结果拼接在一起。