[洛谷P1022]计算器的改良

思路

特别考验细节的模拟。(绕晕!)
主要是移项,\(y=kx\)

  • \(1\):未知数系数为\(1\)\(-1\)
  • \(2\):最后一个常数项漏存。
  • \(3\)\(-0.000\)。(\(0/\)负数\(=-0\))
    正在做的人主要以下几点
    1.\(a\)\(1a\)是等价的....\(-1\)\(-a\)也是
    2.如果你要改符号的时候,要把没有符号的项加上\(+\)
    3.可以在字符串末尾加上如\(#\)之类的符号表示是否已经读完

    Code

#include<cstdio>
#include<cstring>
int main()
{
    char c,s[505];
    int x=0,y=0,a=0,f=1,f1=1,i;
//x为未知数系数(=左),y为常数项(=右),a为正在读入的常数值,f为a的符号,f1为a是否在等号左边。 
    double ans;
    scanf("%s",s);
    for (i=0;i<strlen(s);i++)
    {
        if (s[i]>='0'&&s[i]<='9') 
        a=a*10+s[i]-48;//是数字就存 
        if (s[i]=='-')
        {
            y+=-1*f*f1*a;  //常数项保存,如果前面是未知数此时a为0。 
            f=-1;
            a=0;
        }
        if (s[i]=='+')
        {
            y+=-1*f*f1*a;  //同上。 
            f=1;
            a=0;
        }
        if (s[i]=='=')
        {
            y+=-1*f*f1*a;  //同上。 
            f1=-1;
            f=1;
            a=0;
        }
        if (s[i]>='a'&&s[i]<='z')
        {
            c=s[i];
            if (a) x+=f*a*f1; else x+=f*f1; //未知数系数保存。 
            f=1;
            a=0;
        }
    }
    y+=-1*f*f1*a;  //最后一个常数项。 
    ans=1.0*y/x;   //计算结果。 
    if (ans<=0.000&&ans>-0.0005) printf("%c=0.000",c);
    //最后一个点会卡掉a=-0.000,注意(-0.0005,0.000]的区间。 
    else printf("%c=%.3lf",c,ans);
    return 0;
    }

猜你喜欢

转载自www.cnblogs.com/lyfoi/p/9191499.html