比赛 练习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)));
}