P1022 计算器的改良(模拟&字符串)

题目传送门

题意:输入一个一元一次方程字符串,求解。

思路:和后缀表达式有点类似,不过这个要判断是数字还是字母。每当读取的字母时则对字母前的系数求和,如果遇到运算符就对运算符前的数字求和。以“=”为界限,全部移到一边,最后系数相除得结果,注意-X=0的情况。

#include<bits/stdc++.h>
using namespace std;
int num,x,b,f[3]={1,1,0};//f[0]表示该数在等号的边:1为左边,-1为右边. 
int main(){ //f[1]表示该数的前面的符号为正还是负,1为正,-1为负. 
	char c,ch;//f[2]表示该字符是否为数字 
	while((c=getchar())!='\n'){
		if(isdigit(c)){
			num=num*10+c-'0';
			f[2]=1;
		}
		if(isalpha(c)){//遇到字母对字母前的系数进行运算. 
			if(f[2]) x+=f[0]*f[1]*num,num=0; 
			else x+=f[0]*f[1];
			ch=c,f[2]=0;
		}
		if(c=='+') 	b+=f[0]*f[1]*num,num=f[2]=0,f[1]=1;//当遇到运算符时,对前一个数进行运算. 
		if(c=='-')  b+=f[0]*f[1]*num,num=f[2]=0,f[1]=-1;
		if(c=='=')  b+=f[0]*f[1]*num,num=f[2]=0,f[0]=-1,f[1]=1;
	}
	b+=f[0]*f[1]*num;//如果最后一个是数字则要加上。 
	double ans=(-b*1.0/x);
	if(ans==0) printf("%c=0.000\n",ch);
	else printf("%c=%.3lf\n",ch,ans);
	return 0;
}