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;
        
    }
};