class Solution { public: int s2i(char ch){ return ch-'0'; } 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; } };