输入两个用字符串 str 表示的整数,求它们所表示的数之和。

输入两个用字符串 str 表示的整数,求它们所表示的数之和。
输入两个用字符串 str 表示的整数,求它们所表示的数之和。

img


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