门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,求出的值就是密码。输出密码。(“/”用整数除法)
共1行,为一个算式。
共1行,就是密码。
1+(3+2)(7^2+69)/(2)
258
#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;
}