计算任选 3个 (1 到 9 )的自然数,他们能通过 加减乘数 运算组合 形成 24 。例如 , 1,3,8 就能 通过 1X3X8 这样的运算 得到 24. 或者 7+8 +9 = 24把所有 符合这个条件的数字 组合 列出来。 不考虑顺序。 7,8,9 和 8,9,7 是一组数字。如果要用代码要怎么写?
2 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
最简单的就是穷举,先把1~9的数字的三位不重的排列穷举出来,然后再给每种排列加上运算符,穷举出所有后缀表达式,再求值,最后去重。这是最简单,也是效率最低的方法。
然后进一步考虑题目的特点,不妨规定找到的数字序列前两位优先运算,然后再和最后一位运算。容得三位数要运算得到一个结果,要且仅要两次运算。考虑最后一次运算,最后一次运算必然是四则运算中的其中一个,于是目标转化为穷举出经过一次四则运算可以得到24
的长度为2的数字序列,且该序列的第二个数为1~9这9个整数中的其中一个,第一个数为1~9这9个整数中除了该序列的第二个数外的两个的运算的结果。
比如最后一次运算是加法,则这样穷举
? + 1 = 24 => 23? + 2 = 24 => 22? + 3 = 24 => 21... ? + 9 = 24 => 15
最后一次运算是减法,则这样穷举
? - 1 = 24 => 25 ? - 2 = 24 => 26 ? - 3 = 24 => 27... ? - 9 = 24 => 33
最后一次运算是乘法,则这样穷举
? * 1 = 24 => 24.0 ? * 2 = 24 => 12.0 ? * 3 = 24 => 8.0... ? * 9 = 24 => 2.666666666666667
最后一次运算是除法,则这样穷举
? / 1 = 24 => 24 ? / 2 = 24 => 48 ? / 3 = 24 => 72... ? / 9 = 24 => 216
可以注意到,有一些结果是不可能的,例如216 / 9 = 24
,就算允许重复,9 * 9
最多也不过81
,从而两位不同的1~9的整数的四则运算无法达到216
。
于是我们穷举出了所有两位1~9的整数的四则运算可能得到的结果(有些是不可能的,可以剪枝),继续穷举,我们即可得到结果(会有重复)
? + ? = 23 => 两位不同的1~9的整数的加法运算的结果最多为17,剪枝 ... ? + ? = 17 => 两位不同的1~9的整数的加法运算的结果最多为17,可以继续 ? + 1 = 17 => 16 // 不符合题意,舍去 ? + 2 = 17 => 15 // 不符合题意,舍去... ? + 8 = 17 => 9 // 符合题意,得到序列9、8、7,运算为(9+8)+7 ? + 9 = 17 => 8 // 符合题意,但相同的序列和运算已经存在...
最后还要去重,或者说判断当前穷举出来的序列和运算是否与前面已经得到过的序列和运算等价,这个自己写就好了。
24点牌算法是比较经典的数据结构与算法课程的例题,搜索一下会有更多结果,以上只是我临时的思路,以我的水平,这一定不是最优的解法(没错,我之前没做过这题233)
技不如人,甘拜下风
添加回答
举报
0/150
提交
取消