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;
}