m0_72524251 2022-07-07 23:05 采纳率: 77.8%
浏览 20
已结题

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

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

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

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

2条回答 默认 最新

  • 关注

    输入数据后,把数字和运算符解析出来分别放在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;
    
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月16日
  • 已采纳回答 7月8日
  • 创建了问题 7月7日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?