我被困在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)
我的主要问题是他们是如何得到样本测试的结果的。
答案 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]
扩展限制:
现在,返回所有较低的整数(范围[2,5-1]),并添加这些整数的任何较小的素数。 (我还没有弄清楚是否可以为给定的整数添加多个幂;这是一个有趣的基于质数的问题。)
每当您添加新的目标号码时,请确保按数字顺序插入;前一段中的步骤可能会引入低于触发迭代的“命中”。例如,此可以在查找5832
之前附加4913
(我没有编码并执行此算法)。您可以收集所有添加的目标号码,对该列表进行排序,并将它们作为一个块附加。
虽然很复杂,但我相信这比其他地方的蛮力方法要快得多。