C语言 解决CCF 二十四点问题
利用 C 语言 解决 CCF题库中的二十四点问题
特别致谢:原博主程序
编译环境:
IDE:DEV-C++
语言:C语言
CCF CSP官方往年题库链接点我进入
1. 题目如下:
解题思路:
此题难点在于进行四则运算,加减乘除。
分解法:先将一组数据(一行数据)进行分解为两个子数组 分别存储 数字 和 操作符。在两个数组的基础上进行操作。
for(int i = 0; i < 4; i++){num[i] = str1[i * 2] - '0'; //将字符转化为数值 if(i < 3)op[i] = str1[i * 2 + 1];}
乘除优先计算,加减随后
对操作符数组进行扫描
// 利用for循环先解决乘除优计算 运算后数组需要移位 for(int i = 0; i < times; i++){if(op[i] == 'x' || op[i] == '/') {if(op[i] == 'x') num[i] = num[i] * num[i + 1]; //遇到 X 先执行乘法 计算的结果存入数组中 else num[i] = num[i] / num[i + 1]; //遇到 / 先执行乘法 计算的结果存入数组中//乘除执行后 将后边的元素向前移动 for(int j = i + 1; j < times; j++) {op[j - 1] = op[j];num[j] = num[j + 1];}times = times - 1;//每执行一次,剩余运算的次数减少一次 i = i - 1; //操作符与数组的指标前移一位。 //例如;op[3] = {+,x,+}; 当 i = 1时, 执行乘号//数组为op[3] = {+,+}; 此时 i --; 指向 第一个+号,//然后当执行for中 i++ ,i = 1 指向 第二个 +号 数组同理 // }} //计算加减 sum = num[0]; //将数组的第一个值赋给sum; for(int i = 0; i < times; i++)if(op[i] == '+') {sum = num[i] + num[i + 1];num[i + 1] = sum; //将计算结果赋值给后一个数组[i+1] 方便下一次计算; } else {sum = num[i] - num[i + 1];num[i + 1] = sum;}if(sum == 24)return 1;else return 0;
完整代码如下
#include <stdio.h>/* 判定24点函数 */
int judge(char str1[])
{ int num[4] = {}; char op[3] = {}; int times = 3; //用于控制乘法和加法执行的次数。 int sum = 0; //分离数字和操作符 /*例:str[8] = "9+6x2+3" num[4] = {9,6,2,3};op[3] = {+,x,+};*/ for(int i = 0; i < 4; i++){num[i] = str1[i * 2] - '0'; //将字符转化为数值 if(i < 3)op[i] = str1[i * 2 + 1];}// 利用for循环先解决乘除优计算 运算后数组需要移位 for(int i = 0; i < times; i++) //time运算次数控制 {if(op[i] == 'x' || op[i] == '/'){ if(op[i] == 'x') num[i] = num[i] * num[i + 1]; //遇到 X执行乘法计算的结果存入数组中 else num[i] = num[i] / num[i + 1]; //遇到 / 先执行乘法 计算的结果存入数组中 //乘除执行后 将后边的元素向前移动 for(int j = i + 1; j < times; j++) {op[j - 1] = op[j];num[j] = num[j + 1];} times = times - 1; //每执行一次,剩余运算的次数减少一次 i = i - 1; //操作符与数组的指标前移一位。 //例如;op[3] = {+,x,+}; 当 i = 1时, 乘号执行 //数组为op[3] = {+,+}; 此时 i --; 指向 第一个+号, //然后执行for中 i++ ,i = 1 指向 第二个 +号 数组同理 */ }} //计算加减 sum = num[0]; //将数组的第一个值赋给sum; for(int i = 0; i < times; i++)if(op[i] == '+') {sum = num[i] + num[i + 1];num[i + 1] = sum; //将计算结果赋值给后一个数组[i+1] 方便下一次计算; } else{sum = num[i] - num[i + 1];num[i + 1] = sum;} if(sum == 24)return 1; else return 0;
}int main()
{int n = 0; //输入的表达式的个数 int flag[100] = {0}; //将标志位置空 用于存储 计算结果Yes or No 方便一次性输出 char str[100][8] = {}; //二维数组用于存储输入的数据 scanf("%d",&n);for(int i = 0;i < n;i++){scanf("%s", str[i]); //str[i]表示首地址 二维数组第i行的首地址 flag[i] = judge(str[i]); }for(int i = 0;i < n;i++) //输出格式控制 {if(flag[i])printf("Yes\n"); // X? A:B 文号表达式else printf("No\n"); } return 0;}
测试结果
大家输入乘号时不要打错,输入的是字符‘x’,不是字符‘*’
CCF在线验证
虽然我是使用的C语言编写,但是不知道为什么要选择C++才能编译通过,选择C语言时,结果一直是编译出错。不知道为什么?
结果
大家写完程序要验证时,可以点击文章最前边的CCF官方题库链接点击进去 找到二十四点问题点击进入。
本人博客小白,有写的不恰当的地方,欢迎指教。
C语言 解决CCF 二十四点问题相关推荐
- CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
项目场景: 二十四点问题本质是处理表达式,一提到处理表达式第一反应大概就是使用栈来处理,虽然网上大部分使用python语言处理二十四点问题都是利用强大的eval()函数,但我仍然想要使用python的 ...
- CCF CSP201903-2二十四点
CCF CSP201903-2二十四点 题目描述 要点分析 此题是典型的中缀表达式的求解问题, 可以采用堆栈求解. 具体计算思路: 使用两个栈, num用于存储操作数, opt用于存储操作符 从左往右 ...
- CCF 201903-2 二十四点 用栈模拟简单计算器
二十四点 来源:CCF 背景 二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24. 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四 ...
- 二十四点小游戏——C语言实现
二十四点小游戏(C语言实现) 过程笨拙,有很多局限之处,比如对答案的输出有限制,代码行数过多,故仅供思路参考. #include<stdio.h> #include<windows. ...
- CSP CCF: 201903-2 二十四点 (C++)
目录 题目来源 碎碎念 代码 题目来源 二十四点 碎碎念 加号.减号是同一层 乘法.除法是同一层 优先执行乘除 代码 #include <iostream> #include <fs ...
- 经典二十四点程序游戏
经典二十四点程序算法 来源:http://www.xici.net/d190569991.htm 一.概述 算24点:任意给定四个整数,用加.减.乘.除以及适当的括号连接,无论顺序,使计算结果为24, ...
- 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全
从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...
- CCF201903-2 二十四点(100分)【表达式计算】
问题链接:CCF201903-2 二十四点 问题分析: 表达式计算问题,关键是对输入流进行处理,需要考虑表达式中运算符的优先级.简单的逻辑,用穷举法就可以了. 用Python语言来实现的话,问题就简单 ...
- 『牛角书』基于JS实现的鸿蒙游戏——二十四点纸牌
目录 前言 概述 正式开始 一.创建项目 二.编码 1.项目结构 2.实现思路 3.主要代码块 三.页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩 ...
最新文章
- 从模板方法模式到JDBCTemplate
- 使用lucce分词怎么_真小叮当深度学习:自然语言处理(三)文本处理之分词专题...
- 安卓2.2系统上网设置
- 百度新闻后台逻辑流程分析
- 关于[[NSNotificationCenter defaultCenter] addObserver不remove后续又收到通知crash问题
- wordpress是用php几开发的,php-WordPress多个开发人员设置
- mybaitis动态sql利用bind标签代替%拼接完成模糊查询
- zookeeper注册中心安装(单机版)
- Spring自学教程-AOP学习(五)
- 如何使用fiddler工具抓包?
- java fastfds操作文件
- Leetcode 5053. 地图分析 (150周赛)
- 程序员加油站 -- 不是人人都懂的学习要点
- 如何解决vue项目本地ip地址无法访问项目问题?【亲测有效】
- thinkpad10平板电脑装linux,ThinkPad X61上经历Ubuntu 8.10(安装笔记)
- Learning Convolutional Neural Network for Graphs
- 香农定理与奈奎斯特定理
- 在 Light Trail Adventures 中探索失落已久的复古未来沙漠城市
- 路由交换技术-交换机vlan,trunk,access等配置,保证其连通性,telnet远程登陆配置,osf协议配置,默认路由。
- bzoj2876: [Noi2012]骑行川藏 :拉格朗日乘数法
热门文章
- 2021年9月22日-忆阻神经网络综述
- 前端报错net::ERR_ABORTED 404的解决方案
- html表白程序源码_表白程序源码html_程序员表白代码html
- B. Integers Have Friends(cf)二分 + st表
- nvcc --version: nvcc不是内部或外部命令
- 详解floor函数、ceil函数和round函数
- TI am335x U-boot
- brew的MAC安装
- MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法
- 使用快启动PE修复win10系统引导