[洛谷P1022]計算器的改良
阿新 • • 發佈:2018-06-17
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]計算器的改良