给一个字符串"123456789", 在任意字符中间插入“+”、“-”、“*”、“/”四种运算符,使最后的计算结果等于50。 例如你可以如此插入:1*2*3*4-56-7+89,使这个式子的最终结果等于50。 输出所有可能的式子结果

一、今天观麦的一个笔试题,感觉有点意思

给一个字符串"123456789",
在任意字符中间插入“+”、“-”、“*”、“/”四种运算符,使最后的计算结果等于50。
例如你可以如此插入:1*2*3*4-56-7+89,使这个式子的最终结果等于50。
输出所有可能的式子结果

我的思路一开始是穷举,然后是想着用动态规划的思想去做了,将问题分而治之,使用50 + - * / “空”去计算处理0到i个因子,然后其结果,同最后length-i 个数组成最大值,也就是后面的所有位数不做任何变化,即使最大的(如:78*9<78*10=780<789)所以做比较如果左乘法<50,那么这条路劲就不行,
同理除法>50,加法<50,减法>50;都是结束条件。

以上尝试均失败23333

最后成功还是用了递归啊!

 1 """
 2 给一个字符串"123456789",
 3 在任意字符中间插入“+”、“-”、“*”、“/”四种运算符,使最后的计算结果等于50。
 4 例如你可以如此插入:1*2*3*4-56-7+89,使这个式子的最终结果等于50。
 5 输出所有可能的式子结果。
 6 """
 7 rvs_op = {
 8     "+":"-",
 9     "-":"+",
10     "*":"/",
11     "/":"*",
12 }
13 result = []
14 
15 def inner_make(operator, pos, lastret, remain_num, acc_ret):
16     # 如果操作符为空就将原来的remain 原样返回,并且 pos+1
17     remain_num = remain_num.replace(pos, pos + operator)
18     if operator == "+" or operator == "-":
19         temp = remain_num.split(operator)
20         remain_num = temp[1]
21         lastret = eval(acc_ret + temp[0])
22         acc_ret += temp[0]+operator
23     if pos == "8":
24         ret = eval(acc_ret+remain_num)
25         if ret==50:
26             result.append(acc_ret+remain_num)
27         return
28     pos = str(int(pos) + 1)
29 
30     for i in ["+", "-", "*", "/", ""]:
31         inner_make(i, pos, lastret, remain_num, acc_ret)
32 
33 def make_50(nums: str) -> list:
34     inner_make("", "0", 1, nums, "")
35     return result
36 
37 
38 
39 
40 # 不要修改下面的部分
41 if __name__ == "__main__":
42     results = make_50("123456789")
43     for result in results:
44         assert eval(result) == 50
45     print("OK")
D:projectvenvScriptspython.exe E:/chromeDownload/problem1.py
1+2+3+4+5*6-7+8+9
1+2+3+4+56*7/8-9
1+2+3+4-56+7+89
1+2+3-4+5+6*7-8+9
1+2+3-4+56-7+8-9
1+2+3-4-5+6+7*8-9
1+2+3*4+5+6+7+8+9
1+2+3*4+5-6*7+8*9
1+2+3*4-5*6+7*8+9
1+2+3*4-5*6-7+8*9
1+2+3*45-6+7-89
1+2+34-5-6+7+8+9
1+2+34-56+78-9
1+2-3+4+5+6*7+8-9
1+2-3+4+5-6+7*8-9
1+2-3+4+56+7-8-9
1+2-3+4*5+6+7+8+9
1+2-3+4*5-6*7+8*9
1+2-3+45-67+8*9
1+2-3-4+5*6+7+8+9
1+2-3-4-5+6*7+8+9
1+2-3-4-5-6+7*8+9
1+2-3-4-5-6-7+8*9
1+2-34+5-6-7+89
1+2-34-56/7+89
1+2*3+4-5*6+78-9
1+2*3+45+6-7+8-9
1+2*3-4-5+6*78/9
1+2*3-4*5-6+78-9
1+2*3-45+6-7+89
1+2*3*4+56/7+8+9
1+2*3*4-5+6+7+8+9
1+2*3*4-5-6*7+8*9
1+2*3*4*5-6+7-8*9
1+2*3*4*5-6-7*8-9
1+2*34-5-6-7+8-9
1+23+4+5*6-7+8-9
1+23-4+5+6*7-8-9
1+23-45+6+7*8+9
1+23-45+6-7+8*9
1-2+3-4+5-6*7+89
1-2+3-4-5*6-7+89
1-2+3-4*5+67-8+9
1-2+3-45+6+78+9
1-2+3-456+7*8*9
1-2+3*4-5*6+78-9
1-2+3*45-67-8-9
1-2+3/4*5+6*7/8*9
1-2+34+5+6+7+8-9
1-2+34-5-67+89
1-2+34-5*6+7*8-9
1-2-3+4+56-7-8+9
1-2-3-4+5+6+7*8-9
1-2-3-4+56*7/8+9
1-2-3-4-5-6+78-9
1-2-3*4-5+67-8+9
1-2-34-5-6+7+89
1-2*3+4*5*6+7-8*9
1-2*3+4*5*6-7*8-9
1-2*3-4*5+6+78-9
1-2*3*4+5+67-8+9
1-2*3*4+56/7*8+9
1-2*3*4*5/6+78-9
1-2*34+5*6+78+9
1-23+4+5-6+78-9
1-23+4-5-6+7+8*9
1-23+4*5+6*78/9
1-23-4+5+6+7*8+9
1-23-4+5+6-7+8*9
1-23-4-5-6+78+9
1*2+3+4*5+6*7-8-9
1*2+3+45+6-7-8+9
1*2+3+45-6+7+8-9
1*2+3-4-5*6+7+8*9
1*2+3-45-6+7+89
1*2+3*4+5*6+7+8-9
1*2+3*4-5+6*7+8-9
1*2+3*4-5-6+7*8-9
1*2+3*4*5-6-7-8+9
1*2+3/4*56+7+8-9
1*2-3+4-5+6*78/9
1*2-3+4*5*6-78+9
1*2-3-4+5+67-8-9
1*2-3-4+56/7*8-9
1*2-3-4*5+6+7*8+9
1*2-3-4*5+6-7+8*9
1*2*3+4+5*6-7+8+9
1*2*3+4+56*7/8-9
1*2*3+4-56+7+89
1*2*3-4+5+6*7-8+9
1*2*3-4+56-7+8-9
1*2*3-4-5+6+7*8-9
1*2*3*4-56-7+89
1*2*345/6+7-8*9
1*2*345/6-7*8-9
1*2/3*4+56-78/9
1*23+4+5-6+7+8+9
1*23+4-56+7+8*9
1*23+45+6-7-8-9
1*23-4-56+78+9
1*23-4*5-6*7+89
1*23*4+5+6*7-89
1/2+345/6-7+8-9
12+3+4-56+78+9
12+3-4-5*6+78-9
12+3*4-56-7+89
12+3*4*5+67-89
12-3+4*5*6-7-8*9
12-3+45+6+7-8-9
12-3-4-5+67-8-9
12-3*4+56-7-8+9
12*3+4+5-67+8*9
12*3+4+56/7/8+9
12*3-45+6*7+8+9
12*3-45-6+7*8+9
12*3-45-6-7+8*9
12*3/4*5-67+8*9
12*34/56*7+8-9
12/3+4-5-6*7+89
12/3-4+56-7-8+9
12/3-4*5+67+8-9
12/3*4*5+6*7-8*9
12/3*4*5-6-7-8-9
12/3/4-5*6+7+8*9
12/3/4*56-7-8+9
123+4-5*6-7*8+9
123+4*5-6-78-9
123-4*5-6-7*8+9
123-4*5*6+7*8-9
123/4+5+6*7/8+9
OK

Process finished with exit code 0
原文地址:https://www.cnblogs.com/shiqi17/p/12694930.html