CCF201903-2 二十四点*


问题描述

试题编号: 201903-2
试题名称: 二十四点
时间限制: 1.0s
内存限制: 512.0MB
问题描述:

RequireFile.do?fid=rBtBTn4Auploading.4e448015.gif转存失败重新上传取消
RequireFile.do?fid=h83D3dGauploading.4e448015.gif转存失败重新上传取消

代码:  优先级

1.参考https://blog.csdn.net/tigerisland45/article/details/99167285,直接先计算乘除,再计算加减。

主要要考虑的是计算之后怎么处理:数组做移动、替换。

#include<bits/stdc++.h>
using namespace std;
void judge(string s){
	int a[4],i,j;
	char op[3];
	//从输入中取出数和运算符
	for(i=0;i<4;i++) a[i]=s[i*2]-'0';
	for(i=0;i<3;i++) op[i]=s[i*2+1];
	
	int k=3;//总共计算3次
	//x和/ 
	for(i=0;i<k;i++){
		if(op[i]=='x'||op[i]=='/'){
			if(op[i]=='x') a[i]=a[i]*a[i+1];
			else a[i]=a[i]/a[i+1];
			for(j=i+1;j<k;j++){//前移 
				op[j-1]=op[j];
				a[j]=a[j+1];
			}
			k--;i--;
		}
	}
	int ans=a[0];
        //+-直接做
	for(i=0;i<k;i++){
		if(op[i]=='+'){
			ans=a[i]+a[i+1];
			a[i+1]=ans;
		}else{
			ans=a[i]-a[i+1];
			a[i+1]=ans;
		}
	}
	if(ans==24) cout<<"Yes\n";
	else cout<<"No\n";
}
int main(){
	int n;
	string s;
	cin>>n;
	while(n--){
		cin>>s;
		judge(s);
	} 
	return 0;
} 

2、参考https://blog.csdn.net/swing123lovecoding/article/details/99706693?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 使用堆栈

创建一个栈q,遍历表达式的字符串,如果是1到9的数字则入栈;如果遇到乘法和除法符号,则弹出栈顶元素跟符号后的数字运算,运算结果存入栈中;如果遇到减号,则将符号后的数字变为它的负数,再入栈。最后,依次弹出栈顶元素进行相加。和为24,输出Yes,否则,输出No。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	stack<int> q;
	cin>>n;
	string s;
	while(n--){
		cin>>s;
		for(int i=0;i<7;i++){
			if(s[i]<='9'&&s[i]>='0') q.push(s[i]-'0');
			else if(s[i]=='x'||s[i]=='/'){
				int x,y;
				y=q.top();
				if(s[i]=='x') x=y*(s[i+1]-'0');
				else x=y/(s[i+1]-'0');
				q.pop();
				q.push(x);
				i++;
			}else if(s[i]=='-'){
				q.push(-(s[i+1]-'0'));
				i++;
			}
		}
		int sum=0;
		while(!q.empty()){
			sum+=q.top();
			q.pop();
		}
		if(sum==24) cout<<"Yes\n";
		else cout<<"No\n";
	}
	return 0;
}
发布了145 篇原创文章 · 获赞 0 · 访问量 1261

猜你喜欢

转载自blog.csdn.net/qq_42671442/article/details/104719208