CCF考试题 2019-03-2

二十四点

背景
二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。

题目
定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号 + 表示,减法用符号 - 表示,乘法用小写字母 x 表示,除法用符号 / 表示。在游戏里除法为整除,例如 2 / 3 = 0,3 / 2 = 1, 4 / 2 = 2。
老师给了你 n 个游戏的解,请你编写程序验证每个游戏的结果是否为 24 。

输入
从标准输入读入数据。第一行输入一个整数 n,从第 2 行开始到第 n + 1 行中,每一行包含一个长度为 7的字符串,为上述的 24 点游戏,保证数据格式合法。

输出
输出到标准输出。
包含 n 行,对于每一个游戏,如果其结果为 24 则输出字符串 Yes,否则输出字符串 No。

输入样例
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5

输出样例
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes

样例解释
9+3+4 × 3 = 24
5+4 × 5 × 5 = 105
7 − 9 − 9+8= −3
5 × 6/5 × 4 = 24
3 + 5 + 7 + 9 = 24
1 × 1+9 − 9=1
1 × 9 − 5/9 = 9
8/5 + 6 × 9 = 55
6 × 7 − 3 × 6 = 24
6 × 4 + 4/5 = 24

提示
在这里插入图片描述

解题思路
表达式中存在数字与四则运算符,进行运算时要遵循四则运算法则,简单的字符串来储存会比较麻烦,这时会用栈来计算它的值。一个数字栈一个运算符栈。把减法转化为加法,乘法与除法直接把结果计算出来存入数字栈。
我们需要了解站的知识:
在这里插入图片描述
图片来源于这里

参考代码:

#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int main ()
{
	stack<int> s;
	stack<char> z;
	char str[10];
	int n;
	scanf("%d",&n);
	getchar();
	for(int j=0;j<n;j++)
	{
		while(!s.empty()) s.pop();
		while(!z.empty()) z.pop();
		gets(str);
	int i=0;
	while(i<strlen(str))
	{
		if(str[i]>'0'&&str[i]<='9')
		{
			s.push(str[i]-'0');
		}
		else
		{
			if(str[i]=='+')
			{
				z.push('+');
			}
			else if(str[i]=='-')
			{
				s.push((str[i+1]-'0')*(-1));
				z.push('+');
				i++;
			}
			else if(str[i]=='x')
			{
				int t=s.top();
				s.pop();
				s.push(t*(str[i+1]-'0'));
				i++;
			}
			else if(str[i]=='/')
			{  
				int t=s.top();
				s.pop();
				s.push(t/(str[i+1]-'0'));
				i++;
			}
		}
		i++;
	}
	while(!z.empty())
	{
		int x=s.top();
		s.pop();
		int y=s.top();
		s.pop();
		z.pop();
		s.push(x+y);
	}
	int sum=s.top();
	if(sum==24) printf("Yes\n");
	else printf("No\n");	
	} 
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值