比赛 |
练习12 |
评测结果 |
AAAAA |
题目名称 |
计算器的改良 |
最终得分 |
100 |
用户昵称 |
NVIDIA |
运行时间 |
0.001 s |
代码语言 |
C++ |
内存使用 |
0.41 MiB |
提交时间 |
2017-06-30 12:51:38 |
显示代码纯文本
//Rapiz~~~~~~~~~~~~~~
#include<cstdio>
#include<cctype>
#include<vector>
#include<stack>
#define file(x) "computer."#x
using std::vector;
using std::stack;
enum OP{UND=0,ADD=1,SUB=2,MUL=3};
char buf[100000],alpha;
int n=1,p=1;
int rd(){
int dig=buf[p]-'0';
while(p+1<=n&&isdigit(buf[p+1])) dig=(dig<<3)+(dig<<1)+buf[++p]-'0';
return dig;
}
struct T{
int f,t;//0-->dig 1-->unknown 3-->operaotr
T(int _f,int _t):f(_f),t(_t){}
};
void read(double& ia,double& ib){
while(buf[n]!='='&&buf[n]) n++;
n--;
int dig=0;
OP op=UND;
bool pia=0,pid=0;
stack<T> s;
for(;p<=n;p++){
if(isdigit(buf[p])){
dig=rd();
while(!s.empty()){
int c=s.top().t;
if(c==0||c==1) break;
else if(s.top().f==MUL) {
s.pop();
dig*=s.top().f;
s.pop();
}
else{
dig*=s.top().f==ADD?1:-1;
s.top().f=ADD;
break;
}
}
s.push(T(dig,0));
}
else if(isalpha(buf[p])){
alpha=buf[p];
int f=1;
while(!s.empty()){
int c=s.top().t;
if(c==1)
break;
else if(c==0||(c==3&&s.top().f==MUL)) {
if(c==3)s.pop();
f*=s.top().f;
s.pop();
}
else{
f*=s.top().f==ADD?1:-1;
break;
}
}
s.push(T(f,1));
}
else{
switch(buf[p]){
case '+':s.push(T(ADD,3));break;
case '*':s.push(T(MUL,3));break;
case '-':s.push(T(SUB,3));break;
}
}
}
while(!s.empty()){
T u=s.top();s.pop();
if(u.t==0) ib+=u.f;
else if(u.t==1) ia+=u.f;
else continue;
}
}
double fix(double a){
if(a==0) return 0;
else return a;
}
int main(){
freopen(file(in),"r",stdin);
freopen(file(out),"w",stdout);
scanf("%s",buf+1);
double a,b,c,d;
a=b=c=d=0;
read(a,b),p=(n+=2),read(c,d);
printf("%c=%.3lf",alpha,fix((d-b)/(a-c)));
}