题解:字符串模拟
坑点:
1) 0/-1=-0.
这是因为(来自洛谷讨论区某大犇)
double下存储的数字会有精度误差,比如0可能被存成0.000000000...01
然而如果你乘上或者除以一个负数,可能就变成了-0.000000000...01
然后因为浮点数是先判定符号再计算数值,就出现了负0这一情况
2)我遇到的就这一个....
具体做法是以-,+,=为分界,分别累加字母的系数和实数
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int now,len,f,c,a,b; string s; //6a-5+1=2-2a; char ans; int main(){ ios::sync_with_stdio(false); cin>>s;len=s.length();f=1;s[len]='+';len++; while(1){ if(s[now]>='a'&&s[now]<='z'){ a=a+f*(c==0?1:c);ans=s[now]; f=1; c=0; now++; continue; } if(s[now]=='-'){ b=b+f*c; f=-1;c=0;now++; continue; } if(s[now]=='+'){ b=b+f*c; f=1;c=0;now++; continue; } if(s[now]>='0'&&s[now]<='9'){ c=c*10+s[now]-'0'; now++; continue; } if(s[now]=='='){ b=b+f*c; break; } } b=b*-1;now++;c=0;f=1; while(now<len){ if(s[now]>='a'&&s[now]<='z'){ a=a-f*(c==0?1:c);ans=s[now]; f=1;c=0;now++; continue; } if(s[now]=='-'){ b=b+f*c; f=-1;c=0;now++; continue; } if(s[now]=='+'){ b=b+f*c; f=1;c=0; now++; continue; } if(s[now]>='0'&&s[now]<='9'){ c=c*10+s[now]-'0'; now++; continue; } } if(b==0)printf("0.000 "); else printf("%c=%.3f ",ans,b*1./a); return 0; }