数字代码之和的数字代码

时间:2018-02-09 15:37:15

标签: python algorithm math

我被困在Codewars Kata,我希望有人可以帮助我(不破坏解决方案)。 实际上问题是我并没有完全理解它应该如何工作,我得到了练习的想法,但事情有点令人困惑,特别是在样本测试中。

以下是说明:

  

数字81具有特殊属性,其数字之和的某个幂等于81(九个平方)。八十一(81),是拥有这个属性的第一个数字(不考虑一个数字的数字)。下一个是512.让我们看两个案例的细节。

     

8 + 1 = 9且9 ^ 2 = 81      512 = 5 + 1 + 2 = 8且8 ^ 3 = 512

我们需要创建一个函数power_sumDigTerm(),它接收一个数字n并可以输出这个数字序列的第n项。我们上面提到的案例意味着:

power_sumDigTerm(1) == 81
power_sumDigTerm(2) == 512

以下是样本测试:

test.describe("Example Tests")
test.it("n = " + str(1))
test.assert_equals(power_sumDigTerm(1), 81)
test.it("n = " + str(2))
test.assert_equals(power_sumDigTerm(2), 512)
test.it("n = " + str(3))
test.assert_equals(power_sumDigTerm(3), 2401)
test.it("n = " + str(4))
test.assert_equals(power_sumDigTerm(4), 4913)
test.it("n = " + str(5))
test.assert_equals(power_sumDigTerm(5), 5832)

我的主要问题是他们是如何得到样本测试的结果的。

3 个答案:

答案 0 :(得分:1)

一个好的加速技巧是不检查所有数字,任何这样的数字必须是整数a和b的形式a ^ b。如果您找到一种方法来枚举并检查它们,您将获得一个相当有效的解决方案。

答案 1 :(得分:0)

在f(5)上,数字的总和是5 + 8 + 3 + 2 = 18.并且18 ^ 3 = 5832。 蛮力方法对于下一个看起来像这样: 从5833开始,添加数字,检查总和的功率,看看你是否得到数字。这实际上会非常快,因为你可以看到最后一个只到^ 3。一旦功率大于您要寻找的数字,请转到下一个数字:5834。当您找到一个时,插入表格以记住它。

数论专家可能能够找到更有效的方法,但这种强力方法可能会非常快。

答案 2 :(得分:0)

抓住一个主发电机;你只需要素数才能生成序列(尽管在测试中你将包含所有整数> = 2)。这是因为如果一个数字是一个复合能量,它也是一个主要的力量。

维护一个当前功率列表,以基本整数为索引。例如,一旦你达到100的限制,你就会有列表

[0, 0, 64, 81, 64, 25, 36, 49, 64, 81, 100]
// Highest power no greater than the current limit

...目前的目标号码列表只有一个元素:[81]

扩展限制:

  • 选择列表中的最小数字(25 = 5 ^ 2,在这种情况下)
  • 乘以其基数:25 => 125
  • 检查:1 + 2 + 5根125? (有一些方法可以加快速度)
  • 如果是,请在列表中添加125

现在,返回所有较低的整数(范围[2,5-1]),并添加这些整数的任何较小的素数。 (我还没有弄清楚是否可以为给定的整数添加多个幂;这是一个有趣的基于质数的问题。)

每当您添加新的目标号码时,请确保按数字顺序插入;前一段中的步骤可能会引入低于触发迭代的“命中”。例如,此可以在查找5832之前附加4913(我没有编码并执行此算法)。您可以收集所有添加的目标号码,对该列表进行排序,并将它们作为一个块附加。

虽然很复杂,但我相信这比其他地方的蛮力方法要快得多。