题解 P1022 【计算器的改良 】

· · 题解

#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;
}