4

我一直在考虑一个数学/算法问题,希望您能就如何解决它提出意见!

如果我有一个数字(例如 479),我想将其数字或它们的组合重新组合为与原始数字匹配的数学公式。所有数字都应按其原始顺序使用,但可以组合成数字(因此,479 允许 4、7、9、47、79)但每个数字只能使用一次,所以你不能有像 4x47x9 这样的东西现在数字 4 被使用了两次。

现在举个例子来说明我的想法。这个例子在数学上是不正确的,因为我想不出一个真正有效的好例子,但它展示了输入和预期的输出。

示例输入:29485235

示例输出:2x9+48/523^5

正如我所说,我的示例没有加起来(2x9+48/523^5 不会导致 29485235)但我想知道是否有一种算法实际上可以让我找到这样一个由源数字的数字组成的公式它们的原始顺序将在计算后产生原始数字。

关于使用的数学类型,我会说括号 () 和 Add/Sub/Mul/Div/Pow/Sqrt。

关于如何做到这一点的任何想法?我的想法是通过随机地将数字分开并进行计算以希望得到匹配的结果来简单地强制它。不过一定有更好的方法吗?

编辑:如果以非原始顺序更容易,或者您有解决此问题的想法而忽略了上述一些“条件”,那么理解如何解决此类问题仍然会非常有帮助。

4

3 回答 3

4

对于大约 6 位左右的数字,我会根据以下方案说暴力破解:

1)将您的初始值拆分为一个数字列表(数组,无论如何,根据语言)。最初,这些是数字。

2) 对于每对数字,使用其中一个运算符将它们组合在一起。如果结果是目标数字,则返回成功(并打印出您退出时执行的所有操作)。否则,如果它是一个整数,则在新的、较小的列表上递归,该列表由您刚刚计算的数字和您未使用的数字组成。或者您可能希望允许非整数中间结果,这将使搜索空间更大一些。二进制操作是:

  • 添加
  • 减去
  • 划分
  • 力量
  • 连接(只能用于原始数字或连接产生的数字)。

3) 允许平方根会使搜索空间膨胀到无穷大,因为它是一元运算符。所以你需要一种方法来限制它可以应用的次数,我不确定那会是什么(答案接近 1 时精度损失,也许?)。这是只允许整数中间值的另一个原因。

4) 求幂会迅速导致溢出。2^(9^(4^8)) 太大而无法直接存储所有数字[尽管在基数 2 中它们是什么很明显;-)]。因此,您要么必须接受您可能会错过具有较大中间值的解决方案,否则您将不得不编写一堆代码来根据因子进行算术运算。这些显然不能很好地与加法交互,因此您可能需要进行一些估计。例如,仅通过查看因子数量的大小,我们发现 2^(9^(4^8)) 与 (2^35) 相去甚远,因此无需计算 (2^(9^( 4^8)) + 5) / (2^35)。它不可能是 29485235,即使它是一个整数(它肯定不是 - 另一种排除这个特定示例的方法)。

5)我忘记排除任何输入的简单解决方案,即连接所有数字。不过,这很容易处理,只需通过递归维护一个参数,该参数告诉您是否在通往当前子问题的路由上执行了任何非串联操作。如果没有,请忽略错误匹配。

我对 6 位数的估计是基于这样一个事实,即即使没有解决方案,也很容易编写一个在几分之一秒内运行的倒计时求解器。这个问题的不同之处在于数字必须按顺序使用,但操作更多(Countdown 不允许求幂、平方根或连接,或非整数中间结果)。总的来说,我认为这个问题是可比的,只要你解决了平方根和溢出问题。如果您可以在几分之一秒内解决一个案例,那么您可以在合理的时间内通过一百万个候选人强行闯关(假设您不介意让您的 PC 开机)。

10 位数,蛮力似乎是不可能的,因为你必须考虑 100 亿个案例,每个案例都需要大量的递归。所以我猜你会在两者之间的某个地方达到蛮力的极限。

另请注意,我在顶部的简单算法仍然有很多冗余 - 它不会阻止您执行 (4,7,9,1) -> (47,9,1) -> (47,91),并且然后再做 (4,7,9,1) -> (4,7,91) -> (47,91)。因此,除非您弄清楚这些重复将在哪里发生并避免它们,否则您将尝试 (47,91) 两次。显然,当列表中只有 2 个数字时,这并没有太多工作,但是当列表中有 7 个数字时,您可能不想以 6 种不同的方式将其中的 4 个加在一起,然后解决由此产生的 4 数字问题 6次。倒计时游戏不需要聪明,但据我所知,在这个问题中,它可能会在暴力破解 8 位数字和暴力破解 9 位数字之间产生差异,这非常重要。

于 2009-08-22T09:57:07.233 回答
1

我记得,这样的数字如果存在的话,是极其罕见的。一些数字可以通过它们的组成数字以不同的顺序表示,例如 25 (5²)。

此外,鉴于排列的数量随着数字的增长而极其迅速地增加,因此尝试暴力解决方案充其量是没有希望的。

编辑:部分解决方案。

解决某些情况的部分解决方案是将数字分解为其主要因素。如果它的质因数都相同,并且指数和因数都出现在数字的数字中(例如 25 的情况),那么您就有一个特定的解决方案。

大多数确实属于这类模式的数字将使用乘法或 pow() 作为它们的主要驱动力;加法根本不足以增加它。

于 2009-08-22T09:22:26.290 回答
-1

如果没有建立一个可以复制 Carol Voorderman 的神经网络,我看不到任何除了蛮力工作的东西——人类在看到此类问题的模式方面非常聪明,但编码这种洞察力真的很困难。

于 2009-08-22T09:23:14.387 回答