csp试题2:二十四点

csp试题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+4x3 = 24
5+4x5x5 = 105
7-9-9+8 = -3
5x6/5x4 = 24
3+5+7+9 = 24
1x1+9-9 = 1
1x9-5/9 = 9
8/5+6x9 = 55
6x7-3x6 = 24
6x4+4/5 = 24

子任务
在这里插入图片描述

分析

      接收一个包含加减乘除运算的算式,然后对其进行计算。因为运算优先级不同,所以不能直接进行计算。我先计算第一优先级的,得到一个只包含加减的算式,然后再计算只包含加减的算式。

代码

/*
2019/12/28
csp试题2:二十四点 
*/ 

#include <iostream>
using namespace std;
#include <string>

int main(){
	//1.接收数据 并 声明一个标识 
	int n;
	cin >>n;
	bool flag[n];
	for(int i=0; i<n; i++){
		flag[i] = false;
	} 
	
	//2.接收算式 并 计算 
	//因为乘除运算 与 加减运算 的优先级不同
	//我们先算乘除,将算完乘除的算式保存到num1[]中
	//然后再对num1[]中的算式计算加减法,得出最后结果 
	char opt[3] = "";
	int index_o;	//操作符的索引 
	int num[4];
	int index_n;	//数字的索引 
	char opt1[3] = "";
	int index_o1;
	int num1[4];
	int index_n1;
	
	for(int i=0; i<n; i++){
		index_o = 0;
		index_n = 0;
		index_o1 = 0;
		index_n1 = 0;
		//2.1 接收算式 
		char c; 
		for(int j=0; j<7; j++){
			cin >>c;
			if(c - '0' >= 0 && c - '0' <= 9){
				num[index_n] = int(c - '0');
				index_n++;
			}
			else{
				opt[index_o] = c;
				index_o++;
			}
		} 
		
		//2.2 算乘除,将算完乘除的算式保存到num1[]中
		num1[index_n1] = num[0];
		index_n1++;
		for(int j=0; j<index_o; j++){
			if(opt[j] != 'x' && opt[j] != '/'){
				opt1[index_o1] = opt[j];
				index_o1++;
				num1[index_n1] = num[j+1];
				index_n1++;
			}
			else if(opt[j] == 'x'){
				int temp = num1[index_n1-1] * num[j+1];
				num1[index_n1-1] = temp;
			}
			else if(opt[j] == '/'){
				int temp = num1[index_n1-1] / num[j+1];
				num1[index_n1-1] = temp; 
			}
		}
		
		//2.3 对num1[]中的算式计算加减法,得出最后结果
		int result = num1[0];
		for(int j=0; j<index_o1; j++){
			if(opt1[j] == '+'){
				result = result + num1[j+1];
			}
			else if(opt1[j] == '-'){
				result = result - num1[j+1];
			}
		}
		
		if(result == 24){
			flag[i] = true;
		}
		else{
			flag[i] = false;
		}
	}
	
	//3. 输出结果
	for(int i=0; i<n; i++){
		if(flag[i]){
			cout <<"Yes"<<endl;
		}
		else{
			cout <<"No"<<endl;
		}
	}
	
	return 0;
} 

总结

      计算算式用栈应该会简单一些。我这种方法当不同的优先级变的多时,就不好算了。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值