24点算法研究(C和C++版)

蓝桥杯2024真题B组C/C++ 2024年第十五届蓝桥杯大赛软件类省赛C/C++大学B组真题完整版整理在此,欢迎大家查看 阅读详情

转载自:http://www.cxybl.com/html/bcyy/c/201110206209.html


    第一个算法是用C语言描述的,第二个是C++描述的。我觉得第一种更好理解。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
char op[3], o[5]="+-*/"; 
float n[4], on[10]; 
int used[4] = {0}, top=0, tp=0, x; 
void chk(float k); 
void search24(int d); 
float calc(float n1, float n2, char o); 
void make(int i, float p, float q, char o, int d); 
int main( void ) 
{ 
    printf("please input 4 card number:\n"); 
    scanf("%f%f%f%f", &n[0], &n[1], &n[2], &n[3]); 
    search24(0); 
    printf("No answer.\n"); 
    return 0; 
} 
void chk(float k) 
{ 
    if( (tp != 3) || ( fabs(k-24.0) > 0.000001 )) //没有用完3个运算符或者结果不为24就退出. 
         return; 
    for(x=0; x<5; x+=2)                                            //这样设计是为了使3个选中的符号都可以得到输出. 
        printf("%g%c%g=%g\n", on[x], op[x/2], on[x+1],         //分析得到的. 
                               calc(on[x], on[x+1], op[x/2])); 
    system("pause"); 
    exit(0); 
} 
float calc(float n1, float n2, char o) 
{ 
    switch(o){ 
        case '+': return (n1+n2); 
        case '-': return (n1-n2); 
        case '*': return (n1*n2); 
        case '/': return (n1/n2); 
        default: exit(0); 
    } 
} 
void make(int i, float p, float q, char o, int d) 
{ 
    if(fabs(q)>0.000001 || o!='/')   //除数不为0,或者为0的时候不能为除数. 
        n[i] = calc(p, q, o); 
    op[tp++] = o;  
    chk(n[i]); 
    search24(d+1); 
    tp--;    //因为是全是全局变量,所以在做试验性的循环递归问题时,如果失败,要在递归函数后面重新恢复回原来的值 
} 
void search24(int d) 
{ 
    int i, j, k; 
    float p, q; 
    if(d>=3)    //控制递归深度,就是运算符的输出个数. 
      return; 
    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            if( (i!=j)&& (used[i]+used[j] == 0) ) //i!=j是防止重复,(used[i]+used[j] == 0)是防止又再匹配已经用过的j, 
                //但是i可以新来. 
            {
                used[j] = 1;   //j得到匹配之后,赋值为1,表示已经使用 
                p=n[i];
                q=n[j];
                on[top++] = p;
                on[top++] = q;
                for(k=0; k<4; k++)  //运算符的循环试用. 
                    make(i, p, q, o[k], d);
                n[i] = p;        //因为是全是全局变量,所以在做试验性的循环递归问题时, 
                used[j] = 0;     //如果失败,要在递归函数后面重新恢复回原来的值 
                top -= 2;        // 
            }
} 


C++版本使用了递归+迭代,不容易理解

#include <iostream>   
#include <string>   
#include <cmath>   
using namespace std;   
const  double  PRECISION = 1E-6;   
const  int  COUNT_OF_NUMBER  = 4;   
const  int  NUMBER_TO_BE_CAL = 24;   
double  number[COUNT_OF_NUMBER];   
string  expression[COUNT_OF_NUMBER];   
bool Judgement = false;                    //判断是否有解。 
int count = 0;    
void  Search(int   n)   
{   
      if (n   ==   1) 
   {   
            if ( fabs(number[0] - NUMBER_TO_BE_CAL) <= PRECISION   )  //对于除法,要小心小数的精确位数 
   {   
                  cout << expression[0] << "\t\t";  
      Judgement = true; 
      count ++; 
      if((count % 3)==0) 
       cout<<endl; 
            }   
   else  
   {   }   
       }   
       for(int i=0;  i < n; i++) 
    { 
                for (int j = i + 1; j < n; j++) 
    {   
                        double   a,   b;   
                        string   expa,   expb;   
                        a   =   number[i];   
                        b   =   number[j];   
                        number[j]  =  number[n - 1];   //递归之后,n比以前小一位,所以可以不停向前赋值  
                        expa   =   expression[i];   
                        expb   =   expression[j];   
                        expression[j]  =  expression[n - 1];   //递归之后,n比以前小一位,所以可以不停向前赋值 
                        expression[i]   =   '('   +   expa   +   '+'   +   expb   +   ')';   //加法不需要分顺序 
                        number[i]   =   a   +   b;   
                        Search(n-1); 
                        expression[i]   =   '('   +   expa   +   '-'   +   expb   +   ')';   //减法应该分顺序,减数以及被减数 
                        number[i]   =   a   -   b;   
                        Search(n-1);  
                        expression[i]   =   '('   +   expb   +   '-'   +   expa   +   ')';   //减法应该分顺序,减数以及被减数 
                        number[i]   =   b   -   a;   
                        Search(n-1);  
                        expression[i]   =   '('   +   expa   +   '*'   +   expb   +   ')';   //乘法不需要分顺序 
                        number[i]   =   a   *   b;   
                        Search(n-1);  
                        if (b != 0) 
      {   
                                expression[i]   =   '('   +   expa   +   '/'   +   expb   +   ')';   //除法应该分顺序,除数以及被除数 
                                number[i] = a / b;   
                                Search(n-1);   
                        }     
                        if (a != 0) 
      {   
                                expression[i]   =   '('   +   expb   +   '/'   +   expa   +   ')';   //除法应该分顺序,除数以及被除数 
                                number[i]   =   b  /  a;   
                                Search(n-1);   
                        }   
                        number[i]   =   a;                  //这4句语句是为了防止如果上面几种可能都失败了的话, 
                        number[j]   =   b;                  //就把原来的赋值撤消回去,以无干扰的正确的进入到下一次 
                        expression[i]   =   expa;           //for循环队列中。 
                        expression[j]   =   expb;           // 
                }   
    } 
}   
int  main()   
{   
  cout<<"Please input 4 value of Cards:\n"; 
        for (int i = 0; i < COUNT_OF_NUMBER; i++)  
  {   
                char   buffer[20];    
    cout<<"The "<<i+1<<"th card:"; 
                cin   >>   number[i];                   
                itoa(number[i],   buffer,   10);   //itoa()函数的作用是把第一个参数(数值)传送到第二个参数(字符串)中去,第三个 
               //参数(int型)是该数值在字符串里以什么进制存放。 
                expression[i]   =   buffer;   
        } 
  cout<<endl; 
        Search(COUNT_OF_NUMBER) ; 
  if(Judgement==true) 
  {   
                cout   <<   "\nSuccess."   <<   endl; 
    cout<<"The sum of the ways = "<<count<<endl; 
        }   
  else 
  {   
                  cout   <<   "Fail."   <<   endl;   
        }        
  system("pause"); 
  return 0; 
}  



MD5算法的实现原理与C/C++实现 MD5(Message Digest Algorithm 5)是一种广泛使用的加密哈希函数,由罗纳德·李维斯特(Ronald Rivest)于1991年设计。MD5的目的是从任意长度的数据中产生一个128位(16字节)的哈希值,通常表示为32个十六进制字符。MD5的设计使其用于确保数据的完整性,常见于文件校验、数字签名等场景。:首先对消息进行填充,以使其长度(以位计)模512为448。填充始终以1开始,后跟0,直到满足长度要求。:在填充的消息后追加一个64位的长度字段,表示原始消息的长度(以位计)。 阅读详情

相关推荐

24点游戏题库算法分析

目录一、4数种类分析二、四数排列算法分析三、分数计算类四、加减乘除操作符遍历五、探测4个数是否能计算24统计分析从标有1-10的数字的10个小球中取出1个小球记录小球的数字,然后将小球放回,如此反复4次取出4小球的数字组成的序号一共有多少种。注意:1.1.8.9 和1.8.1.9 算是一种。需要分为一下几种情况:一个有10种一共有10*9种 = 90一共有10 * ( 9 * 8 /2 )种 = 36010表示:10个相等的两个小球( 9 * 8 /2 )表示:另外两个小球不相等的情况。一共有(10*9)/

啊渊的专栏 1243

24点算法研究

24点是一个数学益智游戏,传统24点的规则是 任意取4个1~10的整数,用加、减、乘、除(可加括 号)把这4个数算成24,每个数必须用一次且只能用 一次。 最近要写一个算24点的算法,制作一个24点计算器,所以参考了几篇文献。 《数学游戏24点可行性最小值证明及通用算法》 ...

weixin_44690887的博客 1004

24点游戏无重解算法的研究与探讨

24点游戏无重解算法的研究与探讨 24点游戏无重解算法的研究与探讨

24点游戏及其算法

24点游戏题解 一、问题描述 80年代全世界流行一种数字游戏,在中国我们把这种游戏称为“24点”。现在我们把这个有趣的游戏推广一下:您作为游戏者将得到6个不同的自然数作为操作数,以及另外一个自然数作为理想目标数,而您的任务是对这6个操作数进行适当的算术运算,要求运算结果小于或等于理想目标数,并且我们希望所得结果是最优的,即结果要最接近理想目标数。您可以使用的运算只有:+,-,*,/,您...

weixin_33860553的博客 437

用c++写的算出24点的算法

用c++写的算出24点的算法,运用了算数表达式的计算,总之很不错啦!快来看看吧

c语言递归解24点游戏

c语言使用递归解24点游戏的小程序,程序中有一个小缺陷,但基本的算法是正确的

“24点”的算法分析

“24点”的算法分析楔子论坛上有人在问怎样写计算24点的程序。我觉得这个题目挺有趣的,于是就自己写了一个。虽然这个程序也能运行,而且还曾帮两个同事解决了他们孩子的作业问题,但是我却并不满意。原因很简单:它虽然能列举出所有可能的组合,但这只是我预先分析的结果。如果给出的数字不是4个,而是5个或6个,那么这段程序就彻底报废了。更重要的是,如果有5个,6个或者更多的数字,事先分析的办法也行不通了

shhgs的专栏 5496

24点算法 (C++实现)

C++ 递归实现24点算法, 输入数组,返回所有可以组成24点的结果,并且自动去重 结果为算式 如: (2+10)*2*1=24

24点算法讲解与实现

题目描述:在52张扑克牌中(去掉大小王),随机抽取4张牌,找到所有可能的情况和解。 前言        博主曾在网上看到有很多关于24点的算法,但很多都是没有找全所有表达式,要么就是没有去重,而且搜索的时间过长,有些慢的要半个小时才能得到结果。所以经过我的不懈努力,经过几天的研究,目前我的这个24点的算法能够高效的找出所有解的情况。经过测试,平均在0.1几秒左右就可以找到所有情况。

Tanyboye的博客 2万+

计算24点C++源码(计算24点的C++源代码)

计算24点的C++源代码,里面用2种方式进行了10以内数字任取4个数算24点。 第一种是用递归的方式; 第二种方式采用后缀表达式。 更详细的思路说明及细节介绍请参考我的文章: http://blog.youkuaiyun.com/sun2043430/article/details/8739042

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版

蓝桥杯大赛软件类入门书,有三种语言的版本:C/C++、Java、Python。

罗勇军的博客 1万+

第8.1节 满足构网要求的功率器件与散热设计

摘要: 构网型变流器的功率器件选型与散热设计面临严苛要求,需综合考虑过载能力、暂态应力与可靠性。IGBT模块选型需重点评估电压/电流等级、损耗特性及结温波动,而SiC MOSFET虽具有高频低损耗优势,但面临栅极可靠性等挑战。散热设计需采用液冷等先进技术控制结温波动,并通过电热应力仿真和寿命预测实现可靠性优化。系统化选型流程需结合规范要求、工况谱分析和实测验证,为构网型变流器提供坚实的物理基础。

技术工作者 912

2019年第十届蓝桥杯C/C++研究生组

目录试题A:立方和(填空题5分)试题B:字串数字(5分)试题C:质数试题D:最短路(10分)试题E:RSA解密(15分)试题F:Fibonacci数列与黄金分割(15分)试题G:扫地机器人试题H:修改数组(20分)试题I:灵能传输(25分)试题J:空间跳跃(25分) 试题A:立方和(填空题5分) 题目描述 小明对数位中含有2、0、1、9的数字很感兴趣,在1到40中这样的数包括1、2、9、10至32、39、40,共28个,它们的和是574,平方和是14362,立方和是400816. 请问,在1到2019中

小女不才 2183

从零构建知识图谱:本体工程与知识建模实战指南

本文是一份从零构建知识图谱的实战指南,重点阐述了知识建模与本体工程的核心地位。文章详细介绍了如何使用Protégé工具进行本体设计,包括定义领域、复用现有本体、构建类层次与属性约束,并讲解了如何利用D2RQ工具将关系数据库数据转换为RDF三元组,最终通过Apache Jena Fuseki搭建SPARQL端点进行知识查询与推理,让知识图谱真正“活”起来。

weixin_29057695的博客 568

WPS JS宏实战:批量调整200个Word表格格式的避坑指南(附完整代码)

本文提供了一份详尽的WPS JS宏实战指南,针对批量调整大量Word表格格式的需求。文章深入解析了如何利用JS宏自动化设置字体、行距和边框,并重点解决了常见的“首行访问报错”等核心难题,附有可直接使用的完整代码,帮助用户显著提升文档处理效率。

weixin_29280219的博客 429

有关C/C++语言实现大整数乘法的算法

最近一个月的月底特别忙,一个是忙于学校的课程设计,老师要我们做一个类似于Visio的工具,除了画点函数以外,不能调用任何底层函数,算法图形全部纯手工写,所以实现起来真的好复杂,好在月底检查的时候顺利过关验收,老师给我的是最高分24分,满分25分,有时间我会分享源代码和程序。另外一件事是五月底的一篇我和导师的论文投稿,投的是CCF C类的一个会议(CoNLL 2019 Proceedings),所...

领头“洋” 1456

SMPLify-X关键点映射与OpenPose格式转换实战

本文深入解析了SMPLify-X与OpenPose之间关键点映射与格式转换的实战方法。针对SMPL、SMPL-H、SMPLX等参数化人体模型与OpenPose 2D姿态估计标准之间的数据鸿沟,文章详细对比了双方的关键点定义差异,并提供了核心的Python转换代码与映射表构建思路。通过清晰的步骤讲解与调试技巧,帮助开发者实现3D关节数据到OpenPose标准格式的高效、准确转换,为动作捕捉、3D姿态估计等应用奠定数据基础。

weixin_29046035的博客 166

DeepMind重磅开源强化学习框架!覆盖28款游戏,24多个算法

乾明 边策 一璞 发自 凹非寺量子位 报道 | 公众号 QbitAI没有DeepMind的命,烧不起DeepMind一样的研发投入,但你现在可以有DeepMind苦心多...

量子位 2466

YOLOv11改进策略【独家融合改进】| 模型轻量化二次改进:StarNet + FreqFusion,极限降参,适用专栏内所有轻量化模型

FreqFusion是一种旨在解决密集图像预测任务中特征融合问题。

Limiiiing的博客 2123

Cadence画PCB的傻瓜式教程

1.原理图1)建立元件库2)建立原理图3)在原理图中画好电路图4)利用MENTOR-GRAPHICS-IPC-7351-LP-VIEWER查看元件的封装信息,用pad designer画焊盘,用pcb editor画元件的封装(对照LP_VIEWER),(也可以使用package wizard)5)在原理图中为元件添加封装信息(键入)6)Drc检查7)生成网表2.Pcb1)设置...

tianpu2320959696的博客 1万+

DeepMind重磅开源强化学习框架!覆盖28款游戏,24个算法

没有DeepMind的命,烧不起DeepMind一样的研发投入,但你现在可以有DeepMind苦心多年研究出的算法和代码。 刚刚,这家背靠谷歌,烧了数十亿元的全球顶尖AI研究机构,开源了史上最全强化学习框架OpenSpiel。 在这个框架中,实现了28款可用于研究强化学习的棋牌类游戏和24个强化学习中常用的算法,DeepMind的成名作AlphaGo的基础算法也在其列。 此外,还包括用于分析...

ACBC12345的博客 1129

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2051

枚举+递归算法:计算24

问题描述: 给出4个小于10的正整数,可以使用+-*/()的运算将这4个数连接起来得到一个表达式。问,是否存在一种计算方式可以使表达式的结果为24。 输入: 输入多行数据,每行包括4个小于10的正整数。最后一行数据为4个0,作为数据的终止。 输出: 对于每一组数据,如果可以得到24,则输出“YES”,否则输出“NO”。 样例输入与输出: 5 5 5 1 YES 1 1 4 2...

CrazyTony的博客 582

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

寿星天文历C++实现sxtwl_cpp:如何快速掌握日历计算的终极指南

寿星天文历C++实现sxtwl_cpp是一个基于天文历法算法的高性能日历库,支持从公元前722年至今的精确日期计算。这个开源项目不仅提供了公历、农历、干支、节气等丰富的日历功能,还通过SWIG技术为Python、Java、C#、PHP、Lua等多种语言提供接口,让开发者能够轻松集成到各类应用中。 ## 🚀 快速入门:5分钟搭建开发环境 ### Windows平台构建指南 在Windows系统

gitblog_00239的博客 962

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C语言】C语言编程实战:Base64编解码算法从理论到实现(附完整代码)

base64算法原理讲解和C语言代码实现

科技改变人类,技术成就未来 9159

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 求用1,2,5这三个数不同个数组合的和为100的组合个数
下一篇: chromium log相关
awebkit
博客等级 码龄16年 105粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值