#include <algorithm> #include <string> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ string solve(string s, string t) { // write code here int m = s.size(); int n = t.size(); int ma = max(m,n); int mi = min(m,n); int flage = 0; string res; for(int i = 1;i<=ma;++i) { int num1,num2; if(i<= mi) { num1 = s[m-i] - '0'; num2 = t[n-i] - '0'; } else if(i > mi && m>n) { num1 = s[m-i] - '0'; num2 = 0; } else { num1 = 0; num2 = t[n-i] - '0'; } int sum = num1 + num2; if((sum + flage) >= 10) { res += (sum + flage - 10) + '0'; flage = 1; } else { res += sum + flage + '0'; flage = 0; } } if(flage) res += '1'; reverse(res.begin(), res.end()); return res; } };
解题思路:模拟
上面是自己写的
以下是简洁的版本:
#include <algorithm> #include <string> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ string solve(string s, string t) { // write code here //若是其中一个为空,返回另一个 if(s.empty()) return t; if(t.empty()) return s; //让s为较长的,t为较短的 if(s.size() < t.size()) swap(s,t); int carry = 0;//进位标志 //从后往前遍历较长的字符串 for(int i = s.size()-1;i>=0;i--) { //转数字加上进位 int temp = s[i] - '0' + carry; //获取较短的字符串相应的从后往前的下标 int j = i - s.size() + t.size(); //如果较短字符串还有 if(j >= 0) temp += t[j] - '0';//将其进行加法 carry = temp / 10;//取进位 temp = temp % 10;//去十位 s[i] = temp + '0';//修改结果 } //最后如果还有进位 if(carry) s = '1' + s; return s; } };