洛谷题解P1022 计算器的改良

一、题目

https://www.luogu.org/problemnew/show/P1022

二、代码

#include
using namespace std;

int main()
{
    int coe = 0;         // coe * x = value, coe即为x的系数
    int value = 0;
    int pos = -1;       // 数值位于等号左边的数为负(移到右边即为正),位于等号右边的数为正
    char c = getchar();
    int num = 0;        // 当前读入的数值
    int sign = 1;       // 当前数值符号,
    char x;             // 未知数,26个小写字母之一

    while(true)
    {
        if (c>='a' && c<='z')
        {
            x = c;
            if (num == 0)
            {
                // 系数为1
                coe += -pos * sign;

            }
            else
            {
                coe += -pos * sign * num;   //系数左边为正,右边为负,所以pos要取负
            }

            num = 0;
            sign = 1;
        }
        else if (c == '-')
        {
            value += pos * sign * num;
            num = 0;
            sign = -1;
        }
        else if (c == '+')
        {
            value += pos * sign * num;
            num = 0;
            sign = 1;
        }
        else if (c >= '0' && c <= '9')
        {
            num = num * 10 + c - '0';
        }
        else if (c == '=')
        {
            value += pos * sign * num;
            num = 0;
            sign = 1;
            pos = -pos;     //等号右边pos为正
        }
        else   // 换行的时候,要把最后的数(如果有)累加到valu
        {
            value += pos * sign * num;
            break;
        }

        c = getchar();
    }

    double ans = double(value) / coe;//计算ans

    printf("%c=%.3f", x, ans == 0 ? abs(ans) : ans);//这涉及一个很坑的地方:C++里0除以一个负数值为-0,专门避免这种情况

    return 0;
}

少儿编程、信息学竞赛咨询请加微信307591841或QQ群581357582
信息学竞赛公众号.jpg

你可能感兴趣的:(洛谷题解)