大数运算,计算连续表达式

问题遇到的现象和发生背景

大数运算,计算连续表达式

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

输入数据后,把数字和运算符解析出来分别放在vector中,然后逐2个取数,逐1个取运算符计算,然后把计算结果插入到数字vector中,重复上述操作,直到符号vector为空。
运行结果如下:

img

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

//加法
void add(vector<int> s1,vector<int> s2,vector<int>& sum)
{
    int i=0,flag = 0;
    for(;i<s1.size() && i<s2.size();i++)
    {
        int t = s1.at(i) + s2.at(i) + flag;
        sum.push_back(t%10);
        flag = t/10;
    }

    if(i<s1.size())
    {
        for(;i<s1.size();i++)
        {
            int t = s1.at(i) + flag;
            sum.push_back(t%10);
            flag = t/10;
        }
    }
    if(i<s2.size())
    {
        for (;i<s2.size();i++)
        {
            int t = s2.at(i) + flag;
            sum.push_back(t%10);
            flag = t/10;
        }
    }
    if(flag != 0)
        sum.push_back(flag);

}


//减法
void sub_s(vector<int> s1,vector<int> s2,vector<int>& sum)
{
    int i=0,flag = 0;
    for(;i<s2.size();i++ )
    {
        int t = s1.at(i) - s2.at(i) + flag;
        if(t<0)
        {
            t += 10;
            flag = -1;//借位
        }else
        {
            flag = 0;
        }
        sum.push_back(t);
    }
    //s1中剩余部分
    for(;i<s1.size();i++)
    {
        int t = s1.at(i) + flag;
        if(t<0)
        {
            t += 10;
            flag = -1;
        }else
            flag = 0;
        sum.push_back(t);
    }
}
//判断大小,如果s1>s2,返回1,s1==s2返回0,s1<s2返回-1
int comp(vector<int> s1,vector<int> s2)
{
    if(s1.size() > s2.size() )
        return 1;
    else if(s1.size() < s2.size())
        return -1;
    else if(s1.size() == s2.size() )
    {
        int i=s1.size()-1;
        for(;i>=0;i--)
        {
            if(s1.at(i)> s2.at(i))
                return 1;
            else if(s1.at(i) < s2.at(i))
                return -1;
        }
        if(i==-1) //两者相等
            return 0;
    }
}

//减法,大数减去小数,可以根据长度判断大小
int sub(vector<int> s1,vector<int> s2,vector<int> &sum)
{
    int ret = comp(s1,s2);
    if(ret == 1)
    {
        sub_s(s1,s2,sum);
        return 1; //表示正
    }
    else if(ret == 0)
    {
        sum.push_back(0);
        return 1;
    }
    else
    {
        sub_s(s2,s1,sum);
        return -1;//表示负
    }
}



//显示结果
void show(vector<int> sum,int flag)
{
    if(flag == -1)
    {
        cout << "-";//输出负号
    }
    for(int i = sum.size()-1;i>=0;i--)
        cout << sum.at(i);
    //cout << endl;
}


int main()
{
    char buf[100];

    vector<vector<int> > vAll; //保存所有数据
    vector<char> vOp; //保存所有运算符

    cin.getline(buf,100); //读取一行数据

    int i=0;

    if(buf[0] == '-')//如果第一个数是负数,相当于用0减去这个正整数
    {
        vector<int> vt;
        vt.push_back(0);
        vAll.push_back(vt);
        vOp.push_back('-');
        i++;
    }
    //过滤掉输入中的空格
    while(buf[i] == ' ')
        i++;

    //将数据和运算符放入vector中
    while(buf[i] != '\0')
    {
        vector<int> vt;
        while(buf[i]>='0' && buf[i]<='9')
        {
            vt.insert(vt.begin(),(int)(buf[i]-'0'));//后面的数往前插,逆序存放
            i++;
        }
        vAll.push_back(vt);

        //过滤掉输入中的空格
        while(buf[i] == ' ')
            i++;
        if(buf[i]=='+' || buf[i]=='-')
        {
            vOp.push_back(buf[i]);
            i++;
        }
        if(buf[i]==' ')
            i++;

    }
    int flag = 1;//1表示正数,-1表示负数
    //取数计算
    while(vOp.size()>0 && vAll.size()>=2)
    {
        //取前两个数
        vector<int> a = vAll.at(0); 
        vector<int> b = vAll.at(1);
        //将前两个数从容器中删除
        vAll.erase(vAll.begin());
        vAll.erase(vAll.begin());
        //取运算符,并将运算符从容器中删除
        char op = vOp.at(0);
        vOp.erase(vOp.begin());

        /* 中间过程输出
        cout <<"   》";
        show(a,flag);
        cout << op<<" ";
        show(b,1);
        cout << endl;
        */


        
        vector<int> sum;
        //计算
        if(op =='+') //op是加法
        {
            if(flag == 1) //之前的数是正数,表明是两个数相加
            {
                add(a,b,sum);
                flag = 1;//结果仍然是正数
                vAll.insert(vAll.begin(),sum);
            }else
            {
                flag = sub(b,a,sum);
                vAll.insert(vAll.begin(),sum);
            }
        }else //op是减法
        {
            if(flag == 1)//之前的数是正数
            {
                flag = sub(a,b,sum);
                vAll.insert(vAll.begin(),sum);
            }else
            {
                flag = -1; //之前的数是负数,结果也是负数
                add(a,b,sum);
                vAll.insert(vAll.begin(),sum);
            }
        }


    }
    
    show(vAll[0],flag);
    return 0;

}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632