zhangjinxuan 发表于 2022-10-15 06:50:43

程序制作时的一个问题,请大佬求助

本帖最后由 zhangjinxuan 于 2022-10-15 21:07 编辑

最近在做24点计算器,计算的函数写好了,但是有一个问题,返回的表达式得从左往右计算才可得到结果24

运行实况:

请输入数字个数:4
请输入4个数字:1 2 3 4
此题有解,解法是:1+2+3*4


1+2+3*4,它算出来的结果应该是15,但我想让它算出来的结果是24,就只能这样去加括号:

(1+2+3)*4
但仍然有问题,我该怎么去实现啊?

昨晚盯着一个算式盯了1个小时都没有想出来{:10_291:}

如果题目还不理解,那就理解为:
给你一个表达式,在表达式中添加一些括号(不能添加多余的括号),使这个表达式与从左往右计算的表达式结果相同
样例1:
输入:5*8-6*7
输出:(5*8-6)*7
样例2:
输入:9-8*1*8-6/2
输出:(9-8)*1*(8-6)/2

zhangjinxuan 发表于 2022-10-15 06:58:02

@高山 @柿子饼同学 @陈尚涵 Can you help me?

jhq999 发表于 2022-10-15 07:47:05

本帖最后由 jhq999 于 2022-10-15 08:01 编辑

有个想法
把9-8*1*8-6/2切成不同长度的小段
9-|(9-8)* |(9-8*1)*|(9-8*1*8)-|(9-8*1*8-6)/
8*|8*1*|8*1*8-|(8*1*8-6)/|(8*1*8-6/2)
1*|1*8-|(1*8-6)/|(1*8-6/2)
8-|(8-6)/|(8-6/2)
6/|6/2
2
然后组合
(9-8*1*8-6)/2
(9-8*1*8)-6/2
(9-8*1)*(8-6/2)      (9-8*1)*(8-6)/2   (9-8*1)*8-6/2
.........
9-8*1*(8-6)/2
然后逆波兰计算
不成熟的想法仅供参考

jhq999 发表于 2022-10-15 07:52:17

精简括号:每个小段如果有加减,而且上一个后面有乘除或者对下一小段有乘除保留括号,否则去掉括号

zhangjinxuan 发表于 2022-10-15 08:02:06

jhq999 发表于 2022-10-15 07:52
精简括号:每个小段如果有加减,而且上一个后面有乘除或者对下一小段有乘除保留括号,否则去掉括号

最好给出代码,谢谢大佬

柿子饼同学 发表于 2022-10-15 08:24:33

我去, 这是绿题啊{:10_266:}

zhangjinxuan 发表于 2022-10-15 08:26:36

柿子饼同学 发表于 2022-10-15 08:24
我去, 这是绿题啊

有思路吗,我真的急{:10_266:}

tommyyu 发表于 2022-10-15 08:48:58

我感觉不一定是可以通过从左往右的计算可以的出来,比如4*5+4*1这种式子,所以我感觉你这个思路不太对,应该建一个树,一次拉两个元素进行运算(其实这样就更麻烦了)

tommyyu 发表于 2022-10-15 08:59:14

zhangjinxuan 发表于 2022-10-15 08:57
我的思路是,用一个深搜求出算式,但是算式必须从左往右计算才可得到24,我就想加一些括号,既能按照平时 ...

我的意思是这种方法可能不一定能够求出答案{:10_277:},因为会有那种必须是不按照顺序的算式

zhangjinxuan 发表于 2022-10-15 09:03:24

tommyyu 发表于 2022-10-15 08:59
我的意思是这种方法可能不一定能够求出答案,因为会有那种必须是不按照顺序的算式

你看看代码,我也解释不清楚

人造人 发表于 2022-10-15 09:04:23

这个怎么样?
https://blog.csdn.net/smartboysboys/article/details/20765427

zhangjinxuan 发表于 2022-10-15 09:07:17

人造人 发表于 2022-10-15 09:04
这个怎么样?
https://blog.csdn.net/smartboysboys/article/details/20765427

let me see see...

zhangjinxuan 发表于 2022-10-15 09:08:02

人造人 发表于 2022-10-15 09:04
这个怎么样?
https://blog.csdn.net/smartboysboys/article/details/20765427

不要枚举算法

人造人 发表于 2022-10-15 09:11:47

zhangjinxuan 发表于 2022-10-15 09:08
不要枚举算法

                void dfs(int i, int s) { //深搜找答案
你这dfs和枚举有何区别?

zhangjinxuan 发表于 2022-10-15 09:13:33

人造人 发表于 2022-10-15 09:11
void dfs(int i, int s) { //深搜找答案
你这dfs和枚举有何区别?

你看,你看,你仔细看看吧,我真的急{:10_250:}

tommyyu 发表于 2022-10-15 09:16:54

zhangjinxuan 发表于 2022-10-15 08:57
我的思路是,用一个深搜求出算式,但是算式必须从左往右计算才可得到24,我就想加一些括号,既能按照平 ...

我这里有一个加括号的思路

可以给每一个算式一个等级,只有一个数的话(比如1、2、3、4)是2级

两个二级相加变为一级,不需要加括号
两个一级相加还是一级,也不需要加括号
一个二级和一个二级相加变为一级,也不需要加括号
二级减一级会变成一级,一级不需要加括号,但是需要变号
一级减二级变成一级,不需要加括号
二级乘二级还是二级,不需要加括号
二级乘一级还是二级,一级的式子需要加上括号
二级除以一级或一级除以二级还是二级,一级的式子需要加括号

zhangjinxuan 发表于 2022-10-15 09:19:44

tommyyu 发表于 2022-10-15 09:16
我这里有一个加括号的思路

可以给每一个算式一个等级,只有一个数的话(比如1、2、3、4)是2级


哎,都没有理解题面,语文表达才重要啊{:10_266:}

zhangjinxuan 发表于 2022-10-15 09:26:28

tommyyu 发表于 2022-10-15 08:48
我感觉不一定是可以通过从左往右的计算可以的出来,比如4*5+4*1这种式子,所以我感觉你这个思路不太对,应 ...

不啊,(4*5+4)*1可以啊,但是你提醒了我,加括号前计算一下表达式,如果是24就不用加括号了,就直接返回表达式

zhangjinxuan 发表于 2022-10-15 09:27:01

编程题变成数学题了{:10_266:}

zhangjinxuan 发表于 2022-10-15 09:28:10

tommyyu 发表于 2022-10-15 08:59
我的意思是这种方法可能不一定能够求出答案,因为会有那种必须是不按照顺序的算式

请举例说明,我认为你说的那种必须是不按照顺序的算式调换一下数字位置就可以了
页: [1] 2 3
查看完整版本: 程序制作时的一个问题,请大佬求助