目录

一、4数种类分析

二、四数排列算法分析

三、分数计算类

四、加减乘除操作符遍历

五、探测4个数是否能计算24

六、源码地址


一、4数种类分析

统计分析

从标有1-10的数字的10个小球中取出1个小球记录小球的数字,然后将小球放回,如此反复4次取出4小球的数字组成的序号一共有多少种。注意:1.1.8.9 和1.8.1.9 算是一种。

需要分为一下几种情况:

  • 四个小球数字都相等情况:

一个有10种

  • 三个小球数字相等:

一共有10*9种 = 90

  • 两个小球数字相等,另外两个小球数字不相等

一共有10 * ( 9 * 8 /2 )种 = 360

10表示:10个相等的两个小球

( 9 * 8 /2 )表示:另外两个小球不相等的情况。

  • 两个小球数字相等,另外两个小球也相等。

一共有(10*9)/2 中 = 45

  • 四个小球数字都不想等

 = 10* 9 * 8 * 7 / (4 * 3 *2 *1 ) = 210

总数为=10 + 90 + 360 + 45 + 210 = 715

代码分析

代码中我们可以直接使用遍历的方式进行穷举,

1 . 对比记录列表中的数据是否存在,如果存在就忽略。

2. 如果不存在就添加到列表中。

遍历所有的数据。

#define MAXNUM 10
QList<struNum> initList()
{QList<struNum> list;for (int i1 = 1;i1 <= MAXNUM; i1++) {for (int i2 = 1;i2 <= MAXNUM; i2++) {for (int i3 = 1;i3 <= MAXNUM; i3++) {for (int i4 = 1;i4 <= MAXNUM; i4++) {struNum num(i1,i2,i3,i4);if(!isInList(num,list)){list.append(num);}}}}}return list;
}

判断是否存在列表中

typedef  struct SNUM{SNUM(int num1,int num2,int num3,int num4){this->num1 = num1;this->num2 = num2;this->num3 = num3;this->num4 = num4;}int num1 =0;int num2 =0;int num3 =0;int num4 =0;int c = 0;  // 四个数能够计算24算法。
}struNum;
bool isInList(struNum num, QList<struNum> list)
{int numList[4] = {num.num1,num.num2,num.num3,num.num4};bool result = false;for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){if(i1 == i2) continue;for (int i3 = 0 ; i3 < 4; i3 ++){if(i2 == i3 || i1 == i3) continue;for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 == i4 || i2 == i4 || i3 == i4) continue;foreach(auto item ,list){if(item.num1 == numList[i1]&& item.num2 == numList[i2]&& item.num3 == numList[i3]&& item.num4 == numList[i4]){result = true;}}}}}}return result;
}

二、四数排列算法分析

4个数按照顺序排列,一共有多少种排列方法。

我们可以使用遍历方法,将所有的数字进行遍历,那么可以得到一下算法。可以看到以下算法的步骤需要经过4*4*4*4 次运算。那么我们通过观察可以优化代码算法。

优化前

4*4*4*4 = 256次运算

int numList[4] = {num1,num2,num3,num4};for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){for (int i3 = 0 ; i3 < 4; i3 ++){for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 != i2 && i1 != i3 && i1 != i4 && i2 != i3 && i2 != i4 && i3 != i4){qInfo()<<numList[i1]<<" "<<numList[i2] <<" "<< numList[i3] <<" "<<" "<< numList[i4];c++;}}}}}

优化后

4*3*2 = 24 次运算。

int numList[4] = {num1,num2,num3,num4};int c =0;for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){if(i1 == i2) continue;for (int i3 = 0 ; i3 < 4; i3 ++){if(i2 == i3 || i1 == i3) continue;for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 == i4 || i2 == i4 || i3 == i4) continue;qInfo()<<numList[i1]<<" "<<numList[i2] <<" "<< numList[i3] <<" "<<" "<< numList[i4];c++;}}}}

三、分数计算类

由于计算过程中可能会遇到分数计算,因此我们不能使用int类型直接表示数据,或者是数据运算结果,我们定义一个分数类,专门用来计算分数的,加、减、乘、除,这样可以尽可能保存数据的正确性。

加法

减法

乘法

除法

LNum.h

#ifndef LNUM_H
#define LNUM_Hclass LNum
{public:LNum(int Molecule);LNum(int Molecule,int Denominator);int getMolecule();                   // 获取分子int getDenominator();                // 获取分母void setMolecule(int molecule);      // 设置分子void setDenominator(int denominator);// 设置分母double data();LNum operator + ( LNum p1);LNum operator - ( LNum p1);LNum operator * ( LNum p1);LNum operator / ( LNum p1);bool operator ==( LNum p1) ;
private:// 分子int m_iMolecule = 1;// 分母int m_iDenominator = 1;void Equivalency();         // 约分};#endif // LNUM_H

LNum.cpp

#include "lnum.h"LNum::LNum(int num):m_iMolecule(num),m_iDenominator(1)
{}LNum::LNum(int Molecule, int Denominator):m_iMolecule(Molecule),m_iDenominator(Denominator)
{}int LNum::getMolecule()
{Equivalency();return m_iMolecule;
}int LNum::getDenominator()
{Equivalency();return  m_iDenominator;
}void LNum::setMolecule(int molecule)
{m_iMolecule = molecule;
}void LNum::setDenominator(int denominator)
{m_iDenominator = denominator;
}double LNum::data()
{Equivalency();if(m_iDenominator == 1){return m_iMolecule;}return double(m_iMolecule)/double(m_iDenominator);
}void LNum::Equivalency()
{int num = m_iMolecule> m_iDenominator?m_iDenominator:m_iMolecule;for (int i  = 2 ; i < num ;i++) {if(m_iDenominator%i == 0 && m_iMolecule%i ==0){m_iDenominator = m_iDenominator/i;m_iMolecule = m_iMolecule/i;num = m_iMolecule> m_iDenominator?m_iDenominator:m_iMolecule;}}
}LNum LNum::operator +(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getDenominator() + getDenominator()*p1.getMolecule());res.setDenominator(getDenominator()*p1.getDenominator());return  res;
}LNum LNum::operator -(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getDenominator() - getDenominator()*p1.getMolecule());res.setDenominator(getDenominator()*p1.getDenominator());return  res;
}LNum LNum::operator *(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getMolecule());res.setDenominator(getDenominator()*p1.getDenominator());return  res;
}LNum LNum::operator /(LNum p1)
{LNum res(getMolecule(),getDenominator());res.setMolecule(getMolecule()*p1.getDenominator());res.setDenominator(getDenominator()*p1.getMolecule());return  res;
}bool LNum::operator ==(LNum p1)
{if (getMolecule() == p1.getMolecule() && getDenominator() == p1.getDenominator()) {return true;}else{return false;}}

四、加减乘除操作符遍历

第一步将操作符数字化,方便遍历。可以得到如下公式。x为操作符标识。

double jisuan(LNum num1,LNum num2,int x){switch (x) {case 0:return num1+num2;case 1:return num1-num2 ;case 2:return num1*num2;case 3:return num1/num2 ;}return 0;
}

五、探测4个数是否能计算24

循环遍历4个数的不同位置,并且循环遍历算法。判断其内容是否为24如果是24那么表示可以计算成功。

int is24OK(LNum num1, LNum num2, LNum num3, LNum num4)
{int result = 0;QList<struRecordNum> list;LNum numList[4] = {num1,num2,num3,num4};// 交换4个数字的顺序。for (int i1 = 0 ; i1 < 4; i1 ++) {for (int i2 = 0 ; i2 < 4; i2 ++){if(i1 == i2) continue;for (int i3 = 0 ; i3 < 4; i3 ++){if(i2 == i3 || i1 == i3) continue;for (int i4 = 0 ; i4 < 4; i4 ++){if(i1 == i4 || i2 == i4 || i3 == i4) continue;//  qInfo()<<numList[i1]<<" "<<numList[i2] <<" "<< numList[i3] <<" "<<" "<< numList[i4];int x=suanfatongji(numList[i1],numList[i2],numList[i3],numList[i4],&list);if(x !=0){qInfo()<<"x:"<<x;result += x;}}}}}return result;
}int suanfatongji(LNum num1, LNum num2, LNum num3, LNum num4, QList<struRecordNum> *list)
{LNum sum = 0;int c= 0;for(int i1 = 0 ; i1 < 4; i1 ++){for(int i2 = 0 ; i2 < 4; i2 ++ ){for(int i3 = 0 ; i3 < 4; i3 ++){sum = jisuan(jisuan(jisuan (num1,num2,i1),num3,i2),num4,i3) ;if(24.0  == sum.data()){// 是否找到相同的算法,因为有重复数字可能导致算法想法和数字相同的情况。bool result = false;for(auto item : *list){if(item.num1 == static_cast<int>(num1.data())&& item.num2 == static_cast<int>(num2.data())&& item.num3 == static_cast<int>(num3.data())&& item.num4 == static_cast<int>(num4.data())&& item.option1 == i1&& item.option2 == i2&& item.option3 == i3){result = true;}}if(!result){struRecordNum tmpItem;tmpItem.num1 =  static_cast<int>(num1.data());tmpItem.num2 =  static_cast<int>(num2.data());tmpItem.num3 =  static_cast<int>(num3.data());tmpItem.num4 =  static_cast<int>(num4.data());tmpItem.option1 =  i1;tmpItem.option2 =  i2;tmpItem.option3 =  i3;list->append(tmpItem);c++;qInfo()<< "(( "<< num1.data() <<strOption(i1) << num2.data() <<")"<<strOption(i2)<< num3.data()<<")" <<strOption(i3)<< num4.data();}}}}}return c;
}

六、源码地址

啊渊 / QT博客案例 · GitCode 24点题库分析。

24点游戏题库算法分析相关推荐

  1. 24点游戏python编程代码和运行结果_编程实现24点游戏,我发现自己总是输是有原因的...

    你有玩过24点游戏吗? 两个人轮流从一副扑克牌(不包含鬼牌)中抽牌至有四张手牌为止,利用四张牌上的数字通过加减乘除运算先得出24点的玩家获胜. 一.24点游戏有解的概率 细想一下24点的规则可以发现, ...

  2. Java黑皮书课后题第3章:**3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小、花色

    **3.24(游戏:抽牌)编写程序,模拟从一副52张的牌中抽一张牌,程序应显示牌的大小.花色 题目 题目概述 运行示例 破题 代码 题目 题目概述 **3.24(游戏:抽牌)编写程序,模拟从一副52张 ...

  3. 1000道Python题库系列分享24(41个客观题,numpy专题)

    封面图片:<Python程序设计基础(第2版)>,董付国,清华大学出版社 ============== 好消息:智慧树网APP"知到"中搜索"董付国" ...

  4. 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++

    算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿 ...

  5. python编程狮app题库_‎Python编程狮-零基础学Python im App Store

    Python编程狮是W3Cschool编程狮旗下专门为零基础Python编程爱好者打造的一款入门工具App,致力于帮助初学者入门,轻松迈入编程世界.学Python,从这里开始! [零基础也能学]初学者 ...

  6. c语言编程房屋中介系统,房地产经纪人优题库app下载-房地产经纪人优题库app安卓版下载v4.6.0 - 非凡软件站...

    现在考房地产经纪人的小伙伴也很多,想要更好地学习知识,充分利用闲暇时间,一款好用的手机软件是必不可少的,今天小编就给大家带来一款好用的房地产经纪人学习软件--房地产经纪人优题库,这款软件内有海量题库. ...

  7. python编程狮题库答案_‎Python编程狮-零基础学Python dans l’App Store

    Python编程狮是W3Cschool编程狮旗下专门为零基础Python编程爱好者打造的一款入门工具App,致力于帮助初学者入门,轻松迈入编程世界.学Python,从这里开始! [零基础也能学]初学者 ...

  8. 5导出word_重磅更新 !支持题库导出为word

    重磅更新 本次更新如下: 1 支持题库导出为docx文档 2 支持思维导图源文件导出到邮箱 3 新增积分系统(试用) 2020年02月24日 更新说明   2020年 02 月 24 日 随着我编程技 ...

  9. python编程狮app题库_‎Python编程狮-零基础学Python App Storessa

    Python编程狮是W3Cschool编程狮旗下专门为零基础Python编程爱好者打造的一款入门工具App,致力于帮助初学者入门,轻松迈入编程世界.学Python,从这里开始! [零基础也能学]初学者 ...

最新文章

  1. [JS] 题解:提取不重复的整数
  2. mysql innodb 数据复制_五千万的数据 复制到另张表 是先复制数据再加索引还是先建好索引再复制数据 表引擎Innodb...
  3. python输出所有组合数_生成两个列表的所有组合,并在python中一一输出
  4. linux 自学系列:wc命令
  5. 第一行代码:以太坊(1)-创建自己的私有区块链
  6. android studio 65536错误的解决
  7. 【OpenJ_Bailian - 2711 】 合唱队形(dp,枚举中间顶点)
  8. MySQL 添加列 修改列 删除列
  9. linux远程连接命令有哪些,linux系统远程连接命令有哪些
  10. zebradesginer zpl代码,如何从ZebraDesigner标签获取ZPL代码?
  11. 转 爬虫与反爬虫套路
  12. 2018noip模拟 烷基
  13. 微信小程序周报(第十二期)-极乐小程序商店出品
  14. ApacheCon Asia 2022 启动,7 场阿里云大数据 +AI 议题分享等你围观
  15. python第四次作业——陈灵院
  16. 火车硬座车厢座位分布表
  17. 腾讯——云计算从业者认证系列1
  18. 12000+star的GANSynth,音乐与AI的完美结合
  19. 在电视中使用计算机动画最多的是,计算机动画技术在科教类电视节目中的应用探究...
  20. Auto CAD:CAD三维建模设计之常用工具(实体、曲面、网格)之详细攻略

热门文章

  1. 小程序中加入购物车中手动输入数量
  2. iOS 邮箱正则表达式
  3. 如果国产手机都用鸿蒙,华为自己都不用鸿蒙,那么会有哪个国产手机品牌会使用?...
  4. 蛋花花揭秘中国互联网普及率高达59.6%
  5. windows上安装启动pgsql,postgres
  6. 学术界真的很钟情开源
  7. 王者荣耀s15服务器维护,王者荣耀s15赛季王者峡谷调整 远程打野基本废了
  8. 以我之名,壮哉我大洛克萨斯!
  9. 群狼调研开展公立医院医疗服务满意度调查
  10. linux lsof查询正在运行的,linux lsof命令