https://www.luogu.com.cn/problem/P1022
这道题坑点好多啊。
模拟题就是好烦,我心态太容易炸,应该好好捋思路才是正道。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char last,w;
string s;
int main(){
int f1=1,f2=1,num=0;
double b=0.0,k=0;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]>='a'&&s[i]<='z'){
w=s[i];
if(num) k+=f2*f1*num;
else if(last=='-'||last=='+'||last=='='||i==0) k+=f1*f2;
num=0;
}else if(s[i]=='-'){
if(num) b-=f2*f1*num;
num=0;
f2=-1;
}else if(s[i]=='+'){
if(num) b-=f2*f1*num;
num=0;
f2=1;
}else if(s[i]=='='){
if(num) b-=f2*f1*num;
num=0;
f1=-1,f2=1;
}else{
num=num*10+s[i]-'0';
}
last=s[i];
}
if(num) b-=f2*f1*num;
printf("%c=%.3lf",w,b/k==0?fabs(b/k):b/k);
return 0;
}
一开始很困恼状态的变化,
左边和右边的状态正好相反,
正号和负号的状态相反,
系数和常数的状态相反,
实际上每次乘系数就好了,仔细捋捋。
还要考虑只有未知数的情况,只有未知数时,前面的系数1被忽略了。
我i==1那里wa了一次,忘记考虑在最开始位置的情况了。
最后还要考虑一下-0.000转换的问题,c里面试允许这样的,其意义就相当于0.000但是在显示上就有问题了,所以在printf里再做个判断。