CCF-二十四点

题目

在这里插入图片描述

分析

由于题目中说了,不存在括号以及只有四个数字和三个符号,因此运算形式其实是比较单一的,如果不采用栈,也可以直接分类讨论运算

思路:
分类:
①只有+ -或者只有x / ,这种情况就直接按顺序运算即可;
②+ - 和 x / 混杂:
步骤:
SP1:需要先计算x /,并且把计算的值储存在另开辟的数组中,将原字符串中运算过的数字和符号修改为与储存位置相关的字符(我采用的是 下标+‘a’);

SP2:再判断+ - 符号的位置,进行+ -运算;


还有另外一种方法,就是用两个栈,一个存字符,一个存数字,暂时还未写,下次继续更新

AC代码 1

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin>>n;
	while(n--) {
		int sum=0;
		string s;
		cin>>s;
		int a[3]= {0,0,0};//记录数字 
		int currsize=0;
		int sign=3;
		for(int i=1; i<6; i+=2) {//判断是否全是+-  or全是x/ 
			if(s[i]=='x'||s[i]=='/')
				sign++;
			sign--;
		}
		if(sign==3||sign==0) {//可以从左到右直接顺序运算 
			sum=int(s[0]-'0');
			for(int i=1; i<6; i+=2) {
				if(s[i]=='x')
					sum*=int(s[i+1]-'0');
				else if(s[i]=='/')
					sum/=int(s[i+1]-'0');
				else if(s[i]=='-')
					sum-=int(s[i+1]-'0');
				else if(s[i]=='+')
					sum+=int(s[i+1]-'0');
			}
		} else {// 
			char temp;
			for(int i=1; i<6; i+=2) {//先进行乘除法 
				temp=char(currsize+'a');//将已经运算过的符号和数字改换成temp 表示存储到a[]中 
				if(s[i]=='x') {//如果是乘法 
					if(s[i-1]<='9' and s[i-1]>='0') {//前面的数是数字 
						a[currsize]=int (s[i-1]-'0')*int (s[i+1]-'0');//直接相乘 
						s[i]=s[i-1]=s[i+1]=temp;//s记录表示这里已经运算过了,并且储存在a[]中 
					} else {
						a[currsize]=a[int(s[i-1]-'a')]*int(s[i+1]-'0');//前面的数字已经运算过了,从a[]中提取 
						s[i-3]=s[i-2]=s[i]=s[i-1]=s[i+1]=temp;//标记储存在a[]的位置 
					}
					currsize++;//a[]存储的数量++ 
				}
				if(s[i]=='/') {//同理 
					if(s[i-1]<='9' and s[i-1]>='0') {
						a[currsize]=int (s[i-1]-'0')/int (s[i+1]-'0');
						s[i]=s[i-1]=s[i+1]=temp;
					} else {
						a[currsize]=a[int(s[i-1]-'a')]/int (s[i+1]-'0');
						s[i-3]=s[i-2]=s[i]=s[i-1]=s[i+1]=temp;
					}
					currsize++;
				}
			}
			//接下来计算剩下的+和- 
			int y=0; 
			if(s[0]<='9' and s[0]>='0')//如果第一个数字还是数字 sum=第一个数 
				sum=int (s[0]-'0');
			else
				sum=a[int(s[0]-'a')];//已经运算过了,sum=运算后的 
			for(int i=1; i<6; i+=2) {
				if(s[i]!='+' and s[i]!='-')//找需要进行+ -的符号 
					continue;
				if(s[i+1]<='9' and s[i+1]>='0')//后一个数字
					y=int(s[i+1]-'0');
				else
					y=a[int(s[i+1]-'a')];
				if(s[i]=='+') {
					sum+=y;
				}
				if(s[i]=='-') {
					sum-=y;
				}
			}
		}
	//	cout<<sum<<endl;//方便debug 
		if(sum==24)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MORE_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值