奶茶少冰多芋圆 2021-11-11 20:44 采纳率: 84.4%
浏览 31

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

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

img

  • 写回答

1条回答 默认 最新

  • 从善若水 5G/6G通信领域优质创作者 2021-11-11 20:58
    关注
    
    #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;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 11月11日

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊