求助,悬三关
  • 板块灌水区
  • 楼主yanjiayuan
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/15 22:02
  • 上次更新2024/10/16 09:39:53
查看原帖
求助,悬三关
998556
yanjiayuan楼主2024/10/15 22:02
#include<bits/stdc++.h>
#define ll long long
#define N 500
using namespace std;
ll n,num[N],cnt,st;
char a[N],s[N];
ll pan(char s){
	return (s>='0'&&s<='9');
}
ll yxj(char a,ll b){
	if(a=='+'||a=='-') return 1;
	if(a=='*'||a=='/') return 2;
	if(a=='^') return 3;
	if(a=='('&&b==1) return 0;
	if(a=='('&&b==0) return 4;
	return 0;
}
ll qpow(ll x,ll y){
	ll ans=1;
	while(y){
		if(y&1) ans=ans*x;
		x=x*x;
		y>>=1;
	}
	return ans;
}
void suan(){
	ll t2=num[cnt],t1=num[cnt-1];
	cnt--;
	if(s[st]=='+') num[cnt]=t1+t2;
	if(s[st]=='-') num[cnt]=t1-t2;
	if(s[st]=='*') num[cnt]=t1*t2;
	if(s[st]=='/') num[cnt]=t1/t2;
	if(s[st]=='^') num[cnt]=qpow(t1,t2);
	st--;
}
int main(){
	cin>>a;
	n=strlen(a);
	if(a[0]=='-') num[++cnt]=0;
	for(int i=0;i<n;i++){
		if(i!=0&&a[i]=='-'&&a[i-1]!='+'&&a[i-1]!='-'&&a[i-1]!='^'&&a[i-1]!=')'){
			num[++cnt]=0;
		}
		if(i!=0&&a[i]=='-'&&a[i-1]=='*'){
			num[++cnt]=-1;
			while(st&&yxj('*',0)<=yxj(s[st],1)) suan();
			s[++st]='*';
		}
		if(i!=0&&a[i]=='-'&&a[i-1]=='/'){
			num[++cnt]=-1;
			while(st&&yxj('/',0)<=yxj(s[st],1)) suan();
			s[++st]='/';
		}
		if(pan(a[i])){
			num[++cnt]=0;
			while(pan(a[i])) num[cnt]=num[cnt]*10+a[i]-'0',i++;
			i--;
			continue;
		}
		if(!st){
			s[++st]=a[i];
			continue;
		}
		if(a[i]==')'){
			while(st&&s[st]!='(') suan();
			st--;
		}
		else{
			while(st&&yxj(a[i],0)<=yxj(s[st],1)) suan();
			s[++st]=a[i];
		}
	}
	while(st) suan();
	cout<<num[cnt];
	return 0;
}

题名:表达式计算4

2024/10/15 22:02
加载中...