题目分析:
因为是大数,所以不能:将string转为int,进行相加后,再int转为string。
而是直接模拟加法过程。
我写的:
一些细节:
- 需要反转。因为字符串从左到右遍历,加法从右往左遍历。
- 处理不同长度的字符串时,
- 法一:短的字符串补充‘0’
- 法二:相同位数先进行相加,再对长的字符串进行进位处理。(我采用)
- 本题用到:int和char之间的转换:
- int转char,用char = int + '0'
- char转int,用int = char - '0'
- 此外,补充int和string之间的转换:
- int转string,用string = to_string(int)
- string转int,用int = stoi(string)
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 计算两个数之和* @param s string字符串 表示第一个整数* @param t string字符串 表示第二个整数* @return string字符串*/string solve(string s, string t) {// write code hereint 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;}
};
模板的:
值得采用的点:
- if(s长度<t长度) swap(s,t),从而保证s为长的,t为短的。
- 我另外定义了一个string ans = 二者中长的字符串。
- 一个for循环搞定,遍历长的字符串。在for循环内部,判断短的字符串是否有值,如果有值,让temp累加即可。
- 我用了两个for循环。
- 模板没有用反转,所以在取下标的时候比较麻烦。
- 我用了反转,更简单。但是速度会慢一些。