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

