Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是其数字和的幂的数字_Python_Algorithm_Math - Fatal编程技术网

Python 是其数字和的幂的数字

Python 是其数字和的幂的数字,python,algorithm,math,Python,Algorithm,Math,我陷入了代码战争卡塔,我希望有人能帮助我,而不会破坏解决方案。 事实上,问题是我没有完全理解它应该如何工作,我得到了这个练习的想法,但是事情有点混乱,尤其是在样本测试中 以下是说明: 数字81有一个特殊的性质,它的数字之和的某个幂等于81的九平方。八十一81,是第一个不考虑一位数的数字而具有此属性的数字。下一个是512。让我们看看这两个案例的细节 8+1=9和9^2=81 512=5+1+2=8和8^3=512 我们需要做一个函数,power_sumDigTerm,它接收一个数字n并输出这个数字

我陷入了代码战争卡塔,我希望有人能帮助我,而不会破坏解决方案。 事实上,问题是我没有完全理解它应该如何工作,我得到了这个练习的想法,但是事情有点混乱,尤其是在样本测试中

以下是说明:

数字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)

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

在f5上,数字之和是5+8+3+2=18。18^3=5832。 下一种方法的暴力方法如下所示: 从5833开始,加上数字,检查总和的幂,看你是否得到数字。这实际上是非常快的,因为你可以看到最后一个只到达^3。一旦电源大于您要查找的号码,就转到下一个号码:5834。找到一个后,插入到表中以记住它


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

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

抓取一个主生成器;您只需要素数幂就可以生成序列,尽管测试中将包含所有大于等于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]范围内的所有较低整数,并将这些整数的任何较小素数幂相加。对于一个给定的整数,我还没有计算出是否有不止一个幂可以加;这是一个有趣的基于素数的问题

无论何时添加新的目标编号,请确保按数字顺序插入;上一段中的步骤可能会引入比触发迭代的步骤更低的命中率。例如,这可能会在finds 4913之前追加5832,我还没有编码和执行这个算法。您可以收集所有添加的目标编号,对该列表进行排序,并将它们作为块追加


虽然复杂,但我相信这将比其他地方给出的暴力方法快得多。

你的问题不清楚。为什么他们是如何得到结果的是你的主要问题?为什么这很重要?你想要什么?如果你想要更多的例子,你可以看到序列@martineau我想了解这些例子中的情况,因为我正在编写的代码应该满足样本测试和随机测试中的所有情况。非常感谢@PeterdeRivazSorry,stackoverflow主要用于编码问题,你问的其实不是一。在最后一次测试中,我们应该得到5作为答案,5+8+3+2=18,范围为1,11:print18**i我们得到:18 324 5832 104976 1889568 34012 224 6122 20032 11019960576 198359290368 3570467226624这些幂中的任何一个都不是5,那么5怎么是答案呢?检查数字很快,但看看前几个数字,我们担心这些数字可能不多,下一个数字可能会迫使我们检查许多数字。不,我们不必检查许多数字。以下一个为例:5833:5+8+3+3=19。19^2 = 361. 19^3 = 6859. 已完成,因为6859>5833。我猜即使是蛮力算法也需要不到一秒钟的时间来找到下一个有效的算法。一个有效的算法必须检查陷阱。示例:10000。这些数字之和是1。1比任何幂都是1。确保你的程序不会陷入无限循环!这是非常有用的,非常感谢。这是一个好主意,我会尝试一下,然后给你我的反馈,顺便谢谢你的回答。