问题遇到的现象和发生背景
大数运算,计算连续表达式
输入数据后,把数字和运算符解析出来分别放在vector中,然后逐2个取数,逐1个取运算符计算,然后把计算结果插入到数字vector中,重复上述操作,直到符号vector为空。
运行结果如下:
代码:
#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;
}