利用 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 二十四点问题相关推荐

  1. CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现

    项目场景: 二十四点问题本质是处理表达式,一提到处理表达式第一反应大概就是使用栈来处理,虽然网上大部分使用python语言处理二十四点问题都是利用强大的eval()函数,但我仍然想要使用python的 ...

  2. CCF CSP201903-2二十四点

    CCF CSP201903-2二十四点 题目描述 要点分析 此题是典型的中缀表达式的求解问题, 可以采用堆栈求解. 具体计算思路: 使用两个栈, num用于存储操作数, opt用于存储操作符 从左往右 ...

  3. CCF 201903-2 二十四点 用栈模拟简单计算器

    二十四点 来源:CCF 背景 二十四点是一款著名的纸牌游戏,其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24. 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四 ...

  4. 二十四点小游戏——C语言实现

    二十四点小游戏(C语言实现) 过程笨拙,有很多局限之处,比如对答案的输出有限制,代码行数过多,故仅供思路参考. #include<stdio.h> #include<windows. ...

  5. CSP CCF: 201903-2 二十四点 (C++)

    目录 题目来源 碎碎念 代码 题目来源 二十四点 碎碎念 加号.减号是同一层 乘法.除法是同一层 优先执行乘除 代码 #include <iostream> #include <fs ...

  6. 经典二十四点程序游戏

    经典二十四点程序算法 来源:http://www.xici.net/d190569991.htm 一.概述 算24点:任意给定四个整数,用加.减.乘.除以及适当的括号连接,无论顺序,使计算结果为24, ...

  7. 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全

    从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...

  8. CCF201903-2 二十四点(100分)【表达式计算】

    问题链接:CCF201903-2 二十四点 问题分析: 表达式计算问题,关键是对输入流进行处理,需要考虑表达式中运算符的优先级.简单的逻辑,用穷举法就可以了. 用Python语言来实现的话,问题就简单 ...

  9. 『牛角书』基于JS实现的鸿蒙游戏——二十四点纸牌

    目录 前言 概述 正式开始 一.创建项目 二.编码 1.项目结构 2.实现思路 3.主要代码块 三.页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩 ...

最新文章

  1. 从模板方法模式到JDBCTemplate
  2. 使用lucce分词怎么_真小叮当深度学习:自然语言处理(三)文本处理之分词专题...
  3. 安卓2.2系统上网设置
  4. 百度新闻后台逻辑流程分析
  5. 关于[[NSNotificationCenter defaultCenter] addObserver不remove后续又收到通知crash问题
  6. wordpress是用php几开发的,php-WordPress多个开发人员设置
  7. mybaitis动态sql利用bind标签代替%拼接完成模糊查询
  8. zookeeper注册中心安装(单机版)
  9. Spring自学教程-AOP学习(五)
  10. 如何使用fiddler工具抓包?
  11. java fastfds操作文件
  12. Leetcode 5053. 地图分析 (150周赛)
  13. 程序员加油站 -- 不是人人都懂的学习要点
  14. 如何解决vue项目本地ip地址无法访问项目问题?【亲测有效】
  15. thinkpad10平板电脑装linux,ThinkPad X61上经历Ubuntu 8.10(安装笔记)
  16. Learning Convolutional Neural Network for Graphs
  17. 香农定理与奈奎斯特定理
  18. 在 Light Trail Adventures 中探索失落已久的复古未来沙漠城市
  19. 路由交换技术-交换机vlan,trunk,access等配置,保证其连通性,telnet远程登陆配置,osf协议配置,默认路由。
  20. bzoj2876: [Noi2012]骑行川藏 :拉格朗日乘数法

热门文章

  1. 2021年9月22日-忆阻神经网络综述
  2. 前端报错net::ERR_ABORTED 404的解决方案
  3. html表白程序源码_表白程序源码html_程序员表白代码html
  4. B. Integers Have Friends(cf)二分 + st表
  5. nvcc --version: nvcc不是内部或外部命令
  6. 详解floor函数、ceil函数和round函数
  7. TI am335x U-boot
  8. brew的MAC安装
  9. MySQL5.6建索引时遇到 Specified key was too long; max key length is 767 bytes错误提示解决办法
  10. 使用快启动PE修复win10系统引导