60pts,4RE求调玄关
查看原帖
60pts,4RE求调玄关
1283988
leozhao123楼主2024/7/18 09:15

记录

#include<bits/stdc++.h>
#define  err  cout<<"ERROR\n"//报错 
#define  BOTTOM  ((long long)(1<<31))//栈底元素 
#define  check(a)  ((a)>1000000000?1:0)//检查
using namespace std;
stack<int>s;
string step[20010];
long long num[20010],n,len;
void init()
{
	while(!s.empty()) s.pop();
	s.push(BOTTOM);//防止溢出 
}
bool numx(long long x)// NUM x  栈顶放入 x 
{
	if(check(abs(x))) return 0;
	s.push(x);
	return 1;
}
bool pop()// POP 抛弃栈顶元素 
{
	if(s.size()<2) return 0;
	s.pop();
	return 1;
}
bool inv()// INV 将栈顶元素取出, 然后放入它的相反数 
{
	if(s.size()<2) return 0;
	long long tmp=-s.top();
	s.pop();
	s.push(tmp);
	return 1;
}
bool dup()// DUP 再放入一个和栈顶元素相同的数 
{
	if(s.size()<2) return 0;
	long long tmp=s.top();
	s.push(tmp);
	return 1;
}
bool swp()// SWP 交换栈顶的两个元素 
{
	if(s.size()<3) return 0;
	long long tmp=s.top(),tmp1;
	s.pop();
	tmp1=s.top();
	s.pop();
	s.push(tmp);
	s.push(tmp1);
	return 1;
}
bool add()// ADD 取出栈顶的两个元素, 两元素相加, 所得结果放入栈内 
{
	if(s.size()<3) return 0;
	long long tmp=s.top(),tmp1;
	s.pop();
	tmp1=s.top();
	s.pop();
	if(check(abs(tmp1+tmp))) return 0;
	s.push(tmp1+tmp);
	return 1;
}
bool sub()// SUB 取出栈顶的两个元素, 第二个元素减去第一个元素, 所得结果放入栈内 
{
	if(s.size()<3) return 0;
	long long tmp=s.top(),tmp1;
	s.pop();
	tmp1=s.top();
	s.pop();
	if(check(abs(tmp1-tmp))) return 0;
	s.push(tmp1-tmp);
	return 1;
}
bool mul()// MUL 取出栈顶的两个元素, 两元素相乘, 所得结果放入栈内 
{
	if(s.size()<3) return 0;
	long long tmp=s.top(),tmp1;
	s.pop();
	tmp1=s.top();
	s.pop();
	if(check(abs(tmp1*tmp))) return 0;
	s.push(tmp1*tmp);
}
bool divn()// DIV 取出栈顶的两个元素, 第二个元素整除以第一个元素, 所得结果放入栈内 
{
	if(s.size()<3) return 0;
	long long tmp=s.top(),tmp1;
	s.pop();
	tmp1=s.top();
	s.pop();
	if(tmp==0) return 0;
	if(check(abs(tmp1/tmp))) return 0;
	s.push(tmp1/tmp);
	return 1;
}
bool mod()// MOD 取出栈顶的两个元素, 第二个元素取模以第一个元素, 所得结果放入栈内 
{
	if(s.size()<3) return 0;
	long long tmp=s.top(),tmp1;
	s.pop();
	tmp1=s.top();
	s.pop();
	if(tmp==0) return 0;
	if(check(abs(tmp1%tmp))) return 0;
	s.push(tmp1%tmp);
	return 1;
}
bool ope(int i)// 第 i 个操作 
{
	if(step[i]=="NUM")
	{
		if(!numx(num[i])) return 0;
	}
	else if(step[i]=="POP")
	{
		if(!pop()) return 0;
	}
	else if(step[i]=="INV")
	{
		if(!inv()) return 0;
	}
	else if(step[i]=="DUP")
	{
		if(!dup()) return 0;
	}
	else if(step[i]=="SWP")
	{
		if(!swp()) return 0;
	}
	else if(step[i]=="ADD")
	{
		if(!add()) return 0;
	}
	else if(step[i]=="SUB")
	{
		if(!sub()) return 0;
	}
	else if(step[i]=="MUL")
	{
		if(!mul()) return 0;
	}
	else if(step[i]=="DIV")
	{
		if(!divn()) return 0;
	}
	else if(step[i]=="MOD")
	{
		if(!mod()) return 0;
	}
	else return 0;
	return 1;
}
bool f(long long x)// f(x) 
{
	if(check(abs(x))) return 0;
	s.push(x);
	for(int i=0;i<len;++i)
	{
		if(!ope(i)) return 0;
	}
	if(s.size()!=2) return 0;
	return 1;
}
void getstep()// 读取 
{
    len=0;
    memset(num,0,sizeof(long long)*2010);
	while(cin>>step[len])
	{
 		if(step[len]=="NUM")
 		{
 			cin>>num[len];
 			if(check(abs(num[len])))
 			{
 				err;
 				num[len]=0;
 				continue;
 			}
 		}
		else if(step[len]=="END") return;
		++len;
	}
}
int main()
{
	long long x;
	getstep();
	cin>>n;
	while(n--)
	{
		init();
		cin>>x;
		if(f(x)) cout<<s.top()<<"\n";
		else err;
	}
	return 0;
}

RE原因是数组越界
玄关求调!

2024/7/18 09:15
加载中...