这是牛客的题。
先说一下思路
这是函数名及其参数
string solve(string s, string t)
1、首先
我先把两个传进来的字符串颠倒一下(reverse)
reverse(s.begin(),s.end());
reverse(t.begin(),t.end());
为什么要颠倒呢
例如有两个字符串
“994”
”9“
如果要遍历字符串的话,两个字符串第一个遇到的就是9 和9
但是实际情况应该是9和4相加
所以如果颠倒一下,就是”499“和”9“了 ,9和4先相加
2、使连个字符串的长度相等,没有的补0
if(s.size() < t.size()){
int len =t.size() - s.size();
for(int i = 0;i < len;i++)
s.append("0");
}
else if(s.size() >t.size()){
int len = s.size() - t.size();
for(int i = 0;i <len;i++)
t.append("0");
}
这样的话就不用处理其中一个字符串已经遍历完,但是另一个字符串没有遍历完的情况了。很方便
3、最后
从头处理两个字符串就行了,有进位的把carry置为1
下次两个字符相加的时候再加上carry就行
while(i < s.size()&&j < t.size())
{
int num = (carry + (s[i]-48) + (t[j]-48));//cout<<"num"<<num<<" ";
if( num> 9)
{
int tmp = num % 10;
carry = 1;
str = to_string(tmp) + str;
}
else {
carry = 0;
str = to_string(num) + str;
}
i++;
j++;
}
if(carry == 1) str = "1" + str;
完整代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t) {
reverse(s.begin(),s.end());
reverse(t.begin(),t.end());
int carry = 0;
int lens = s.size(),lent = t.size();
int i = 0, j = 0;
string str;
if(s.size() < t.size()){
int len =t.size() - s.size();
for(int i = 0;i < len;i++)
s.append("0");
}
else if(s.size() >t.size()){
int len = s.size() - t.size();
for(int i = 0;i <len;i++)
{
t.append("0");
}
}
while(i < s.size()&&j < t.size())
{
int num = (carry + (s[i]-48) + (t[j]-48));//cout<<"num"<<num<<" ";
if( num> 9)
{
int tmp = num % 10;
carry = 1;
str = to_string(tmp) + str;
}
else {
carry = 0;
str = to_string(num) + str;
}
i++;
j++;
}
if(carry == 1) str = "1" + str;
return str;
}
};