输入两个用字符串 str 表示的整数,求它们所表示的数之和。
输入两个用字符串 str 表示的整数,求它们所表示的数之和。
#include <iostream>
#include <algorithm>
#include <sstream>
using namespace std;
int strComp(string &s1, string &s2)//返回0,表示len1>len2
{
int len1 = s1.length();
int len2 = s2.length();
if (len1>len2)
return 0;
else if (len1<len2)
return 1;
else
{
if (s1 >= s2)
return 0;
else
return 1;
}
}
string itos(long long tmp)
{
stringstream ss;
ss << tmp;
string s1 = ss.str();
return s1;
}
string add1(string numStr1, string numStr2) //两个都是正
{
string res;
int c = 0, temp;
if (numStr1.size() != numStr2.size())
{ //长度不同先补零
while (numStr1.size() < numStr2.size())
{
numStr1.insert(0, 1, '0');
}
while (numStr1.size() > numStr2.size())
{
numStr2.insert(0, 1, '0'); //在0下标元素前面插一个0
}
}
for (int i = numStr1.size() - 1; i >= 0; i--)
{ //按位相加,从低位开始
temp = (numStr1[i] - '0') + (numStr2[i] - '0') + c;
if (temp>9)
{
temp = temp % 10;
c = 1;
}
else
c = 0;
res += itos(temp);
}
if (c == 1) res += '1';//最高位还有进位,则补1个'1'
reverse(res.begin(), res.end());//逆置字符串后结果就是相加后的值(res是从低位往里添加字符的)
return res;
}
string add2(string numStr1, string numStr2) //两个都是负
{
string res;
int c = 0, temp;
if (numStr1.size() != numStr2.size())
{ //长度不同先补零
while (numStr1.size() < numStr2.size())
{
numStr1.insert(1, 1, '0');
}
while (numStr1.size() > numStr2.size())
{
numStr2.insert(1, 1, '0'); //在1下标元素前面插一个0
}
}
for (int i = numStr1.size() - 1; i>0; i--)
{ //最高位不管
temp = (numStr1[i] - '0') + (numStr2[i] - '0') + c;
if (temp>9)
{
temp = temp % 10;
c = 1;
}
else
c = 0;
res += itos(temp);
}
if (c)res += '1';//最高位
res += '-'; //添加'-'
reverse(res.begin(), res.end());
return res;
}
string add3(string numStr1, string numStr2) //一正一负
{
string res;
int flag = 0;
int c = 0, temp;
string a, b;//a-b a是被减数 b是减数 带负号的给减数
if (numStr1[0] == '-') { b = numStr1; a = numStr2; }
else{ b = numStr2; a = numStr1; }
b = b.substr(1);
if (a.size() != b.size())
{ //长度不同先补零
while (a.size() < b.size())
{
a.insert(0, 1, '0');
}
while (a.size() > b.size())
{
b.insert(0, 1, '0'); //在0下标元素前面插一个0
}
}
if (strComp(a, b) == 1)
{
string t = b;
b = a;
a = t;
flag = 1;
}
for (int i = a.size() - 1; i>=0; i--)
{ //最高位不管
temp = (a[i] - '0')-(b[i] - '0')-c;
if (temp<0)
{
temp =temp+10;
c = 1;
}
else
c = 0;
res += itos(temp);
}
if(flag==1)res += '-'; //添加'-'
reverse(res.begin(), res.end());
return res;
}
int main()
{
string numStr1, numStr2;
while (cin >> numStr1 >> numStr2)
{
string result;
if (numStr1[0] != '-'&&numStr2[0] != '-') result = add1(numStr1, numStr2);
else if (numStr1[0] == '-'&&numStr2[0] == '-') result = add2(numStr1, numStr2);
else result = add3(numStr1, numStr2);
cout << result << endl;
}
system("pause");
return 0;
}