题解 P1022 【计算器的改良 】
爱自由的我666
·
·
题解
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
char a[1010];
int main()
{
cin >> a;
char c;//记录一元一次方程的未知数,用于后来的输出
int s1 = 0,s2 = 0,t = 1,s,k = 1;//s1:常数的和 s2:未知数系数和
queue<int >Q;//用队列来存储系数
int len = strlen(a);//字符串长度
for(int i = 0; i<len; i++)//遍历输入的一元一次方程
{
s = 0;
if(a[i]>='0'&&a[i]<='9')//当为数字时入队列
{
Q.push(a[i]-'0');
}
else if(a[i]=='-')//当前面符号为负号时改变t为-1
{
while(!Q.empty())//取出队列中的元素与s1求和
{
s = s*10+Q.front();
Q.pop();
}
s1+=t*k*s;
t = -1;
}
else if(a[i]=='+')//当前面符号为正号时改变t为1
{
while(!Q.empty())//同上
{
s = s*10+Q.front();
Q.pop();
}
s1+=t*k*s;
t = 1;
}
else if(a[i]=='=')//等号右边的数据符号与左边的符号应该相反,故用k来改变其符号
{
while(!Q.empty())
{
s = s*10+Q.front();
Q.pop();
}
s1+=t*k*s;
t = 1;
k = -1;
}
else
{
c = a[i];
while(!Q.empty())
{
s = s*10+Q.front();
Q.pop();
}
if(s==0)
s = 1;//当未知数前面的系数为1时可以省略,此时s=0应改为1
s2+=t*k*s;
}
}
s = 0;//取出队列中的元素和s1相加
while(!Q.empty())
{
s = s*10+Q.front();
Q.pop();
}
s1+=t*k*s;
s1 = -s1;
if(s1==0)//防止输出为-0.000
printf("%c=0.000\n",c);
else
printf("%c=%.3f\n",c,1.0*s1/s2);
//cout<< setiosflags(ios::fixed) << setprecision(3) << 1.0*s1/s2 << endl;
return 0;
}