1. 问题描述:
我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015 就是符合要求的答案。 请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交。 (对于示例,就是提交10)。
输出
注意:需要你提交的是一个整数,不要填写任何多余的内容。
2. 思路分析:
对于这种尝试可能性(不确定结果)而且数据量不大的题目,最好的解决方法是递归,因为递归可以搜索所有的可能并且在搜索的过程中找到满足题目的方案,在递归出口输出结果或者是使用变量记录下满足条件的结果返回。对于这种道题目来说也是如此,我们可以使用递归搜索所有可能的加号与乘号的组合方式,分析题目可以知道存在两个平行状态,可以选择加号也可以选择乘号(并且目前已经使用的乘号数量要小于2才可以选择乘号),在写递归方法的时候根据自己需要的参数传递对应的参数即可,因为是需要递归到49这个数字,所以我们在递归方法中应该传递一个变量index表示当前递归的位置,这样可以在递归的过程中尝试加号与乘号对当前的数字进行操作,根据题目的条件可以知道等式中只有两个乘号所以需要传递一个记录当前已经使用乘号的数目,只有当当前乘号的数目小于2的时候才可以使用乘号,传递一个str字符串变量来记录中间递归的过程,这样在满足题目要求的时候输出结果判断递归方法是否正确,传递当前经过加号与乘号的运算结果,这样在递归的出口的时候才可以判断出结果是否满足了2015,根据自己的需求需要一个参数传递一个参数即可。在很多递归的题目都可以使用List[str]/str/set/dict来记录中间的结果这样可以验证到达递归出口的时候某些值是否满足了题目的要求。最终提交的答案为16
3. 代码如下:
# 使用index记录当前的位置, count记录乘号的数量, rec来记录中间的结果这样可以方便输出, res记录到目前位置的运算结果
def dfs(index: int, count: int, rec: str, res: int):
# 出口, 对于确定index==49还是50可以根据下面调用的时候index + 1可以确定: 因为最终是要到49这个数字的, 而index + 1可以到达50这个数字所以在出口应该判断index=50
if index == 50:
# print(rec)
if res == 2015 and count == 2:
print(rec)
return
if res > 2015:
# 结果大于了2015肯定是不符合题目要求的, 直接return返回即可
return
# 当count小于2的时候那么有两种选择的, 当大于等于2的时候只有一种选择
if count < 2:
# 乘法的时候要注意res结果的计算, 一开始的时候写成了res * index是错误的
dfs(index + 1, count + 1, rec + "*" + str(index), res - index + 1 + (index - 1) * index)
dfs(index + 1, count, rec + "+" + str(index), res + index)
if __name__ == '__main__':
# 分析题目可以知道其实就是搜索所有的可能性, 使用递归即可
# index从2开始, rec为等式中的第一个数字
dfs(2, 0, "1", 1)