Algorithm 获取到达数字的最短序列(+;,-,*,/)
我正在做一项任务: 程序得到一个数字作为输入,输出是从0到该数字所需的步数。 规则:Algorithm 获取到达数字的最短序列(+;,-,*,/),algorithm,Algorithm,我正在做一项任务: 程序得到一个数字作为输入,输出是从0到该数字所需的步数。 规则: 执行顺序是从左到右,所以+、-、*和/都是 平等 如果数字为负数,则添加10000(您只需执行0-4即可获得数字9996) 如果partresult大于10000,程序只记住最后4位数字 只有结果为整数时才能进行除法(不可能为5/4) 您只能使用数字4 输入示例: 42 示例输出: 9 最短的解决方案是: 4 + 4 + 4 * 4 - 4 * 4 - 4 - 4 / 4 我真的不需要整个解决方案,
- 执行顺序是从左到右,所以+、-、*和/都是 平等
- 如果数字为负数,则添加10000(您只需执行0-4即可获得数字9996)
- 如果partresult大于10000,程序只记住最后4位数字
- 只有结果为整数时才能进行除法(不可能为5/4)
- 您只能使用数字4
42
示例输出:
9
最短的解决方案是:
4 + 4 + 4 * 4 - 4 * 4 - 4 - 4 / 4
我真的不需要整个解决方案,所以如果你能把我推向正确的方向,我将不胜感激
谢谢您的时间。我通常从“天真”的解决方案开始思考,并尝试改进这些想法 最天真
1级:4级
二级:4+4=8,4-4=0,4*4=16,4/4=1
三级:8+4,8-4,8*4,8/4,0+4,0-4,0*4,0/4。。。 当然,这具有指数复杂性,这是非常糟糕的 溶液增强 我们可以看到,许多分支都是“死胡同”,可以被切断。 此外,一些(许多)数字会重复出现,它们的分支可以“重用” 换句话说:
为编号X创建节点时,将新节点保存在X下的哈希中,
当最终遇到X时,不要创建新节点,而是将其指向已创建的节点。
注意:此分支已中断,因为它正在循环通过已知的值 我没有时间对这个解决方案的复杂性进行建模,但对于大多数数字来说,它应该是可行的解决方案 此外 如果我们仔细观察,我们可以很容易地看到,这棵树不会因每次函数调用而改变,无论是对于哪个数字。。。仅增长和扩展,
因此,在前几次运行之后,我们更有可能在“hash”@~O(1)中找到请求的数字,
如果它不存在,那么如果我们不存在,我们就离它更近了 完全不同(但不完整)的方法 这个想法并不完整,但我认为值得一提,以便您进一步展开。
我们或许可以通过贪婪的方式逃脱:
- 乘以4,只要
x*4
- 添加4,只要
x+4相应地添加3,2,1
但这只是一个开始。这是你的任务吗?这就是为什么我不要求一个完整的解决方案,只是一个方向。我完全迷路了。@Raxume谢谢你接受我的答案:)所以建议在接受答案之前让24-48小时过去,这是为了鼓励其他人也回答,然后选择最合适的答案:)这是我创建的程序,它可以工作,但在某些输入(例如9501、8323)时失败。你觉得怎么样?谢谢你的时间。我没有读程序,但是什么失败了?它找不到价值?崩溃还有什么?值是错的-没有崩溃,没有无限循环。为什么错了?找到一条更短的路了吗?你有没有试着打印“痕迹”,但它计算错了?这就是问题所在,我不知道为什么,8323有痕迹