【问题标题】:I really can't figure out where to start我真的不知道从哪里开始
【发布时间】:2015-10-07 02:55:50
【问题描述】:

通过使用 1 到 9 的 9 个数字,您应该找到使用乘法和加法获得 N 的方法的数量。

例如,如果给出 100,你会回答 7。

原因是有7种可能的方式。

100 = 1*2*3*4+5+6+7*8+9

100 = 1*2*3+4+5+6+7+8*9

100 = 1+2+3+4+5+6+7+8*9

100 = 12+3*4+5+6+7*8+9

100 = 1+2*3+4+5+67+8+9

100 = 1*2+34+5+6*7+8+9

100 = 12+34+5*6+7+8+9

如果给你这个问题,你会怎么开始?

【问题讨论】:

  • 系统地思考问题。九位数字之间有八个位置。每个都可以被“*”、“+”或“”(串联)占据。您将需要在所有八个位置循环所有三种可能性。然后你必须有某种方式来表示操作序列和某种算术评估方式。
  • 这个问题最好在math.stackexchange.com 上回答,因为这个问题与编程无关。
  • 可能有一些巧妙的数学技巧可以避免在这里进行详尽的搜索,但我不知道。
  • 与除法和零余数有关..只是一个想法我得到这可能不是一个解决方案..
  • @zwol 我不太确定。没有八个位置,因为他在那里有多个数字。实际上,这就是困难所在 - 我做了一个假设所有单个数字的答案,它是 11 行代码,但是使包括每个长度在内的数字的所有可能排列有点棘手。

标签: c algorithm math


【解决方案1】:

我们可以使用括号吗?这将大大增加可能性的数量。

我会首先尝试找到第一个加法项,比如说 1×23。这些数量有限,并且由于我们无法减去,我们知道如果我们得到一个高于目标的词,我们可以从搜索中删除它。这让我们寻找 23 + f = 100 的解,其中 f 是另一个形式完全相同的公式。但这与解决数字 4-9 和目标 77 的原始问题完全相同!因此,递归调用您的算法并将该子问题的解决方案添加到原始问题的解决方案中。也就是说,如果我们有 23 + 4,对于数字 5-9 且 n = 73 的子问题是否有任何解决方案?分而治之。

您可能会从部分解决方案的动态表中受益,因为您可能会以不同的方式获得相同的子问题:1+2+3 = 1×2×3,因此使用数字 4–9 和目标解决子问题94 次重复工作。

根据最受约束的原则,从右到左可能比从左到右更好。与 1+2+3、1×2×3、12×3、12+3 或 1×23 相比,89、8×9 或 78+9 为可能的解决方案留出的空间要小得多。

【讨论】:

  • 不我们不允许使用括号
  • 这对我来说很有意义。谢谢。
  • @Lebanner 添加了关于从哪个方向搜索的注释。
【解决方案2】:

有三种可能的操作

  addition
  multiplication
  combine, for example combine 1 and 2 to make 12

每个操作员有 8 个职位。因此,总共有 3^8 = 6561 个可能的方程。所以我会从

for ( i = 0; i < 6561; i++ )

【讨论】:

  • 我认为合并操作没有八个位置。 12和21是两个不同的数字。所以有 72 个不同的两位数字,如果 N 是 1,000,000,那么我们可能需要 3、4 甚至 5 位数字,而且数量很多。
  • @JerryJeremiah 问题中没有迹象表明您可以更改数字的顺序。如果您能够重新排序数字,那么将有超过 7 个解决方案,例如1 + 2 * 3 + 4 + 65 + 7 + 8 + 9
  • 很公平。我一定是误解了这个问题。
最近更新 更多