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;
}
};
注意点:
tmp = (s[i]-'0'+t[i]-'0'+carry);
字符加减法时使用的是ASCII码的数值,需要先减掉0对应的ASCII码值,最终才能得到对应的整数数值;s = '1' + s;
其中s是字符串,这一操作可以在其前插入字符串1,也可以使用s = "1"+ s;
。
参考资料: