任意110中的4个数字,使用加减乘除计算得出24结果的可能组合(java版),很多人小时候都玩过roberg

需求:任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合;通过初步分析,我们可以得到如下规则:规则:1、任意1-10中的4个数字;2、使用加减乘除计算得出24;

3、在任何一次计算中不能出现小数,比如:(4.0+8.0)/(3.0/6.0)=24.0,这种是不算的,虽然最终结果是24,因为3/6=0.5;(8.0/3.0)*(4.0+5.0)=24.0,虽然最终为24,但是在第一步结果却是小数,所以不成立;代码如下

/***是否为合法的计算结果*@paramresult*@return*/publicstaticbooleanisValidResult(doubleresult){if(result<1){returnfalse;}returnresult==Math.floor(result);}ViewCode4、整个运算中应该使用double类型,因为整数相除,使用int类型,在计算机中,会把余数抹掉,直接取整,这样就会造成结果不正确;

一般来说我们都会通过案例来分析,比如:这个需求,我们使用传统的计算,假设我们已经有这四个数[3,4,8,6],可能会有如下组合:

方案:((4.0+8.0)*6.0)/3.0=24.0;方案:((3.0*4.0)-8.0)*6.0=24.0;方案:((8.0-6.0)*3.0)*4.0=24.0;方案:((4.0+8.0)/3.0)*6.0=24.0;

方案:(4.0*3.0)*(8.0-6.0)=24.0;方案:(6.0/3.0)*(4.0+8.0)=24.0;

我们暂时先分析这个几个方案,大家看到这里,可以先思考一下有什么规律,有什么规则;

....................................................................................................Thinking..............................

从这些方案中,我们可以得出如下蹊跷之处:1、所有的方案中,都在这四个数的所有可能排列组合中(我记忆之中,应该是高中数学的知识点);2、我们可以把计算法则归纳为两种,所有的都可以归纳到一下两种中去;第一、从左到右的依次计算;第二、两两组合,前两个数计算结果和后两个数的计算结果再次计算;第三、每个方案都有3个运算符;

不知道大家是不是和我发现的一样不,或者说有更多的发现;我认为不管什么发现都可以先列出来,然后在逐个去去除一些太离谱的发现;我们再继续顺藤摸瓜,到此我们可以把需求分解如下:

我们继续分析需求,看看是否可以再次分解

从上面的需求中我们可以进一步进行分解

第一、如何获取四个数的所有排列组合?1、举例,我们继续使用案列来分析,比如[3,4,8,6][3,4,8,6](基准)[4,3,8,6](第二和第一调换)[3,8,4,6][8,3,4,6](第三和第二调换,第二和第一调换)[3,4,6,8][3,6,4,8][6,3,4,8](第四和第三调换,第三和第二调换,第二和第一调换)这样是不是所有的排列组合呢显然不是?因为还有三种基准进行上面的排列组合,也就是上面每行最后一列[4,3,8,6](基准2)[8,3,4,6](基准3)[6,3,4,8](基准4)2、通过上面的举例,我们就可以先获取所有的基准组合;3、通过上面,我们可以知道每种基准的所有组合;4、通过上面的方法获取的组合会有重复,需要前需要去重;这样我们就能获取4个数的所有排列组合;我感觉这种获取所有排列组合的算法很笨重(有没有感觉有点想冒泡排序),不优雅,肯定有更优的方案,只是我不知道而已,如果知道的可以留言,谢谢;所有排列分析到此,是不是还需要继续分析,可以继续思考;本人感觉可以落地了;如果觉得需要继续分析的,可以继续分解,知道自己很清晰,知道怎么干为止(这个因人而异);请看代码;

获取所有基准代码:

double[]array={3,4,6,8};ListresultAllList=newArrayList<>();Listlist=newArrayList<>();list.add(array);list.add(newdouble[]{array[1],array[2],array[3],array[0]});list.add(newdouble[]{array[2],array[3],array[0],array[1]});list.add(newdouble[]{array[3],array[0],array[1],array[2]});ViewCode获取每个基准的所有排列组合:

/***计算array能算24点的所有组合,从左到右的顺序**@param*@throwsException*/publicstaticintcaculate24Point(double[]array)throwsException{intcount=0;if(array.length!=4){thrownewException("不是四个数");}for(Stringop:operators){StringexpressionStr="";doubleresult=getTwoNumCaculate(array[0],array[1],op);if(!isValidResult(result)){continue;}expressionStr=String.format("(%s%s%s)",array[0],op,array[1]);for(Stringop2:operators){doubleresult1=getTwoNumCaculate(result,array[2],op2);if(!isValidResult(result1)){continue;}StringexpressionStr2=String.format("(%s%s%s)",expressionStr,op2,array[2]);for(Stringop3:operators){doubleresult2=getTwoNumCaculate(result1,array[3],op3);StringexpressionStr3=String.format("%s%s%s",expressionStr2,op3,array[3]);if(result2==24.0d){count++;System.out.println(String.format("方案:%s=%s",expressionStr3,result2));}}}}returncount;}ViewCode

2、两两组合,思路和上面有些相似,

前两个数的任意计算结果1,后两个数的任意计算结果2,结果1和结果2的任意计算结果3,结果3和24对比,如果相等,那就是可行方案;举例:(3.0*4.0)*(8.0-6.0)=24.0;

/***计算array能算24点的所有组合,两两组合**@paramarray*@return*@throwsException*/publicstaticintcaculate24Point2(double[]array)throwsException{intcount=0;if(array.length!=4){thrownewException("不是四个数");}for(Stringop:operators){doubleresult1=getTwoNumCaculate(array[0],array[1],op);if(!isValidResult(result1)){continue;}StringexpressionStr1=String.format("(%s%s%s)",array[0],op,array[1]);for(Stringop2:operators){doubleresult2=getTwoNumCaculate(array[2],array[3],op2);if(!isValidResult(result2)){continue;}StringexpressionStr2=String.format("(%s%s%s)",array[2],op2,array[3]);for(Stringop3:operators){doubleresult3=getTwoNumCaculate(result1,result2,op3);StringexpressionStr3=String.format("%s%s%s",expressionStr1,op3,expressionStr2);if(result3==24.0d){count++;System.out.println(String.format("方案:%s=%s",expressionStr3,result3));}}}}returncount;}ViewCode

某一种四个数的所有运算排列通过上面的方式我们可以全部获取,分析到此,我觉得代码可以落地,当然,如果你觉得还不够清晰,可以继续分析,直到自己清晰为止,这里我只是提供分解需求的思路而已;在软件工程中,我们必定先分析需求,然后分解需求,我们有四色分析方式,我们还有DDD领域的分析方式等,都是需要通过逐步分解成更小的需求来反复验证的;

到目前为止我们可以得出如下思维导图

最后,我们把每个小的需求加上一些规则逻辑组合成完整的大需求,我们暂时叫做编排吧;这里其实也是一个难点,很多人希望一次性把代码写完整,写正确,其实这种思路是不正确的,这样只会增加代码的难度,一次性能把代码写的有多完整多正确,这个跟每个人的编程经验熟练度有关;不管编程多牛,从无到有的敲代码方向不是一次性把左右的代码完成,重点方向把核心逻辑思路编写上,其次才逐步把一些细节逻辑规则加上去,这个就和我们小时候学画画一样,画一颗树先画主干然后画叶子最后添加果子和花之类的;

到目前为止是否完整呢?其实还差一点,任意的1-10的数字从哪里获取,不过需求没有明确,可以是用户输入,数据库获取,其他接口的传入,我们这里就定位用户输入吧

获取用户输入代码如下:

double[]array=newdouble[4];intindex=0;Scannerscanner=newScanner(System.in);while(index<4){System.out.println(String.format("请输入第%s个1-10的整数",index+1));StringtempNumStr=scanner.nextLine();if(!StringUtils.isNumeric(tempNumStr)){System.out.println("你输入的不是一个整数");continue;}doubletmpNum=Double.valueOf(tempNumStr);if(tmpNum<0||tmpNum>10){System.out.println("你输入的数字不是1-10的数字");continue;}array[index++]=tmpNum;}System.out.println(String.format("你输入的4个1-10的整数为%s,%s,%s,%s",array[0],array[1],array[2],array[3]));

THE END
1.排列三中奖中二个号,别再错过希望!1、和数值法:将“排列3”的3位数相加,研究它的三位数和数值的规律,它的和数值范围在0-27之间,容易掌握中奖走势,所以是比较常用的一种办法。 2、奇偶法:研究3个数中奇偶数出现次数的方法。 3、大小法:把0-4定为小,5-9定为大,研究3个数大小搭配的方法。 https://res.17500.cn/arts/sdetail-10415504.html
2.排列组合概率:从0,1,2,.,9十个数字中任选3个不同的数字,求三个∴P(同时含0和5)=8/C(10,3)=1/15.∴P(不含0或5)=14/15. 解析看不懂?免费查看同类题视频解析查看解答 更多答案(4) 相似问题 从1,3,5,7,9这5个数字中任取两个数字,从0,2,4,6这四个数字中任取两个数字 求数学好的同学,排列组合问题:0-9这十个数字,到底有多少种不同的排列组合(允许重复https://www.zybang.com/question/4366dec65278c13041e6e6403a6ec002.html
3.GitHub举个例子来说吧,比如 nums1 = {3},nums2 = {2, 4, 5, 6, 7},K=4,要找两个数组混合中第 4 个数字,则分别在 nums1 和 nums2 中找第 2 个数字,而 nums1 中只有一个数字,不存在第二个数字,则 nums2 中的前 2 个数字可以直接跳过,为啥呢,因为要求的是整个混合数组的第 4 个数字,不管 numhttps://github.com/sunmiaozju/leetcode
4.sql计算两个小数乘积学会这个方法,掌握乘法中乘积最大最小的解法用2,5,6,8,9这五个数字组成一个三位数和一个两位数,乘积最大是95×862=81890。 这时有同学可能又会提出,这5个各不相同的数字中如果含有0,要怎样排乘积才能最大呢? 按照上述方法,仍然将各不相同的5个数按照从大到小的顺序排列起来,然后并分成3级,最后一级只有一个0,而0和“0”一样大,故这个0可以放在https://blog.csdn.net/weixin_39574869/article/details/111385446
5.Java面试题大全(整理版)1000+面试题附答案详解最全面看完稳了7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性能问题和解决方案: MySQL 面试题 1、MySQL 中有哪几种锁? 2、MySQL 中有哪些不同的表格? 3、简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 https://maimai.cn/article/detail?fid=1752437513&efid=uSgZIWSJqvkGwxf4vJW75w
6.排列五走势图排列五中三数字区间综合振幅走势图2体彩排列五中三数字区间综合振幅走势图2 期数设置 - 期 形态 组3 组6 最近50期 最近100期 数字区间: 区 0: 1: 2: 3: 4: 标记形式选择: 不带遗漏数据 遗漏分层 辅助线 带折线 序号 期号 奖号 百十位和尾振幅 百个位和尾振幅 十个位和尾振幅 百十位差值振幅 百个位差值振幅 十个位差值振幅 https://zst.cjcp.com.cn/cjwssc_rs/view/ssc_szqjzh-lhwzf-2-pl35.html
7.3D只要你选择的1个胆码中开奖号码其中之一,则用胆码全拖以上45个组合,一定中组选6(但不含豹子,如111,222);还可以通过排除奇偶,大小等减少投注组合;如判断出组3则不用全拖,只要包下含胆码的组合买组3。 例如:220期:开158,如用5做胆,排除组3,余36注组选6。 https://www.360doc.cn/mip/63024184.html
8.浙江体彩网>>玩法规则>>中国体育彩票“排列3”游戏介绍“排列3”为全国联网的体育彩票玩法,于2004年12月9日在浙江上市,迅速成为深受彩民喜爱的彩种。从2005年底开始,“排列3”进行了一系列派送活动,更激发出彩民的投注热情,同时返奖率也屡次创造纪录。 玩法规则 “排列3”是从000-999的数字中任选一个三位数为投注号码进行投注,投注方式分为直选投注和组选投注。直选投https://www.zjlottery.com/Rule/Lotto/201005/10770.html
9.重发不容错过的彩蛋:官方排除法&花名口令(余兴派对第二季剧本中看似怪异的台词、情节,在后续其他人的故事中都能够获得解答,挖坑、填坑做得是有条不紊。不过就像是拼图一般,只盯着一块看时不明所以,而只有当所有拼图都归位,才会佩服编剧们的设计巧妙(等本季完结后,再来整理补充一波剧情上容易错过的前后呼应)虽然本剧的思路确实适合以剧集展开,一集一个嫌疑人、一种画风,https://movie.douban.com/review/15421184/
10.2015年国家公务员备考:公务员行测必考必会——数字推理1、 数列中每一个数字都是n 的平方构成或者是n 的平方加减一个常数构成,或者是n的平方加减n构成。 2、 每一个数字都是n的立方构成或者是n的立方加减一个常数构成,或者是n的立方加减n。 3、 数列中每一个数字都是n的倍数加减一个常数。 以上是数字推理的一些基本规律,必须掌握。但掌握这些规律后,怎样运用这https://xiangyang.huatu.com/2014/0822/902666.html
11.关于中国体育彩票排列3游戏组选2码全包购买方式的公告[江苏体彩网]中国体育彩票排列3游戏组选2码全包购买方式是指从“0-9”中选择2个或2个以上的不重复数字,所选数字分别与“0-9”每个数字组成的3位数字的所有组合进行的多注组选投注。组选2码全包票面标明“组选2码全包票”字样,并显示所选的2个不重复数字。 特此公告。 https://www.js-lottery.com/wfzq/p3p5/wfzq/cms/post-133855.html
12.7星彩奖池破3亿助力二等奖奖金惊喜“升级”将选择号码的所有排列组合均进行投注 组成多注单式投注的投注方式 而前区全组合投注是组合投注的一种 是将前区选择的6位数字的 所有排列组合均进行投注的投注方式 如前区投注123456,后区投注1 则购买了前区由 1、2、3、4、5、6这6个数字 后区由1构成的所有7星彩投注号码 http://tyj.lishui.gov.cn/art/2021/12/24/art_1229216253_58921816.html
13.循环游离DNA中肿瘤相关突变基因检测的参考品的制作方法2.目前,获取肿瘤基因相关信息的主要来源仍是受试者的肿瘤组织样本。然而,对于部分晚期癌症患者而言,无法得到肿瘤组织样本,也不适合进行动态监测。 3.大量的临床研究证明,在外周血中存在循环的游离dna(circulating free dna,或cfdna),而在肿瘤患者的外周血cfdna中包含循环肿瘤dna(ctdna,circulating tumor dna)。对血浆https://www.xjishu.com/zhuanli/27/202210293003.html