题目分析:
我看很多大佬都把这个题目考虑的有点“过于周到”了,这个题目我的理解是直接把系数合并放到=左边,常数合并放到=右边,具体怎么实现呢?
我们先设置一个控制正负(1,-1)符号的参数,再设置一个判别等号左右(1,-1)的参数。用这两个参数来模拟系数和常数的位置(即系数在左,常数在右)。具体怎么实现看代码~
#include<bits/stdc++.h>
using namespace std;
int modulu,constant;//系数;常数
char x;//字符
void Calculation() {
char temp;
int t=0,fu=1,l=1;//数字;数字前数字的正(1)负(-1)号;等号左(-1)右(1)
while((temp=getchar())!='\n') {
//先判断数字
if(temp>='0'&&temp<='9') {
t*=10;
t+=(temp-'0');
} else {
if(temp>='a'&&temp<='z') {
if(t==0) {
modulu+=fu*l;//系数为1的情况
} else {
modulu+=t*fu*l;
}
x=temp;//存临时未知数
} else {
constant+=t*fu*(-l);//相当于将常数放到等号右面
}
t=0;
}
//再判断符号
if(temp=='-') {
fu=-1;//负号
} else if(temp=='+') {
fu=1;//正号
} else if(temp=='=') {
l=-1;//等号右面的情况
fu=1;
}
}
//如果最后一项是非0常数项的话,不会执行else语句中常数的赋值
//那么常数就没办法存下来,因此多一个判断
//我一开始也没有考虑这个问题,呜呜~~,WA了一个测试点
if(t!=0) constant+=t*fu*(-l);
}
int main() {
Calculation();
cout<<constant<<" "<<modulu<<endl;
printf("%c=%.3f\n",x,1.*constant/modulu==0?0.000:1.*constant/modulu);
//三目运算符为了防止负0的出现,0除一个负数会得-0.000
return 0;
}