站外题求助
  • 板块题目总版
  • 楼主woooooook
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/12/12 19:54
  • 上次更新2023/11/5 06:12:48
查看原帖
站外题求助
353396
woooooook楼主2020/12/12 19:54

【题目描述】

门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。输出密码。(“/”用整数除法)

【输入】

共1行,为一个算式。

【输出】

共1行,就是密码。

【输入样例】

1+(3+2)(7^2+69)/(2)

【输出样例】

258

RE代码

#include<bits/stdc++.h>
using namespace std;
const int N=1000001;
int sk1[N],sk2[N]={10},top1,top2,len,ctrl,seq[8]={-1,1,1,2,2,4,4,3};
char str[N]={'('},ys[8]={'\0','+','-','*','/','(',')','^'};
bool number(char c){return c-48>=0&&c-48<=9;}
int find(char c){for(int i=1;i<=7;i++)if(ys[i]==c)return i;}
int qp(int n,int x){
	if(x==1)return n;
	if(x==2)return n*n;
	return qp(n,x/2)*qp(n,x/2)*(x%2==0)?1:n;
}
int main(){
	gets(str+1);
	len=strlen(str+1);
	str[len+1]=')';
	for(int i=0;i<=len+1;i++){
		if(number(str[i])){
			if(!number(str[i-1]))top1++;
			sk1[top1]=sk1[top1]*10+str[i]-48;
		}
		else{
			sk2[++top2]=ctrl=find(str[i]);
			if(seq[ctrl]!=4&&seq[ctrl]<=seq[sk2[top2-1]]){
				int s1=sk1[top1-1],s2=sk1[top1];
				top1--;
				switch(sk2[top2-1]){
					case 1:sk1[top1]=s2+s1;break;
					case 2:sk1[top1]=s2-s1;break;
					case 3:sk1[top1]=s2*s1;break;
					case 4:sk1[top1]=s2/s1;break;
					case 7:sk1[top1]=qp(s2,s1);break;
				}
				sk2[top2-1]=sk2[top2],top2--;
			}
			if(ctrl==6){
				while(sk2[--top2]!='('){
					int s1=sk1[top1-1],s2=sk1[top1];
					top1--;
					switch(sk2[top2-1]){
						case 1:sk1[top1]=s2+s1;break;
						case 2:sk1[top1]=s2-s1;break;
						case 3:sk1[top1]=s2*s1;break;
						case 4:sk1[top1]=s2/s1;break;
						case 7:sk1[top1]=qp(s2,s1);break;
					}
					sk2[top2-1]=sk2[top2],top2--;
				}
			}
		}
	}
	printf("%d",sk1[top1]);
	return 0;
}
2020/12/12 19:54
加载中...