思路
特别考验细节的模拟。(绕晕!)
主要是移项,\(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;
}