当前位置: 代码迷 >> 综合 >> P1022 计算器的改良
  详细解决方案

P1022 计算器的改良

热度:21   发布时间:2024-01-25 22:34:26.0

题目链接

题目分析:
我看很多大佬都把这个题目考虑的有点“过于周到”了,这个题目我的理解是直接把系数合并放到=左边,常数合并放到=右边,具体怎么实现呢?

我们先设置一个控制正负(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;
}