class Solution {
public:
inline int s2i(char ch){
return ch-'0';
}
inline char i2s(int i){
return i+'0';
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t) {
if((s.empty()&&!t.empty())||(!s.empty()&&t.empty())||(s.empty()&&t.empty())) return s.empty()?t:s;
//n_t is an identier?
int ns = s.size(), nt = t.size();
int max_size = ns>=nt?ns:nt;
int min_size = ns<nt?ns:nt;
string &max_str = ns>=nt?s:t;
string &min_str = ns<nt?s:t;
//max_size+1: 1+99=100, 一位数加二位数会产生三位数
string re***ax_size+1,'0');
// car 是进位标志, 产生进位则置为1, 否则为0
int car = 0, i=max_size-1, j=min_size-1;
//计算res[0,min_size-1]的部分,这部分是把两个数字按竖式摆好的对齐的部分
for( ; i>=0,j>=0; i--, j--){
int temp = s2i(max_str[i])+ s2i(min_str[j])+car;
res[i+1] = i2s(temp%10);
car = temp>=10?1:0;
}
//上一步骤结束后,两个数字中较***的下标
int idx_gz = i<0?j:i;
//现在计算res[0, idx_gz+1]部分,也就是两个数字中较***比较短者多出的那部分
//其实就是计算多的那部分加1的结果
for(i=idx_gz; i>=0; i--){
int temp = s2i(max_str[i])+car;
res[i+1] = i2s(temp%10);
car = temp>=10?1:0;
}
//处理最后的进位标志
car==1? res.at(0)=i2s(1):res.at(0)=i2s(0);
//如果以0开头,则将0删除
res.at(0)=='0'? res.erase(re***egin(), re***egin()+1):res.erase(re***egin(), re***egin());
return res;
}
};