1. 程式人生 > >[洛谷P1022]計算器的改良

[洛谷P1022]計算器的改良

HA 符號 ret tro 的人 char lse 等號 常數

思路

特別考驗細節的模擬。(繞暈!)
主要是移項,\(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; }

[洛谷P1022]計算器的改良