【发布时间】:2018-12-28 15:18:32
【问题描述】:
我需要从作为列表传递给函数的整数中找到x1 ^ (x2 ^ (x3 ^ (... ^ xn))) 的个位。
例如,输入 [3, 4, 2] 将返回 1,因为 3 ^ (4 ^ 2) = 3 ^ 16 = 43046721 的最后一位是 1。
该函数需要尽可能高效,因为显然尝试计算767456 ^ 981242 不是很快。
我尝试了一些方法,但我认为解决这个问题的最佳方法是使用序列。例如,任何以1 结尾的数字,当提升到幂时,总是以1 结尾。对于2,生成的数字将以2, 4, 6 or 8 结尾。
如果一个数字是幂次方,则结果数字的最后一位数字将遵循基于指数最后一位数字的模式:
1:序列为 1
2:序列为 2、4、8、6
3:序列为 3、9、7、1
4:序列为 4、6
5:序列为 5
6:序列为 6
7:序列为 7、9、3、1
8:序列为 8、4、2、6
9:序列为 9, 1
0:序列为0
我认为计算整个最后一位数字的最简单方法是通过列表向后工作,并一次计算每个计算的最后一位数字,直到我回到开始,但我不知道该怎么做? 如果有人可以帮助或建议另一种与此相同或更有效的方法,将不胜感激。
到目前为止我有这段代码,但它不适用于非常大的数字
def last_digit(lst):
if lst == []:
return 1
total = lst[len(lst)-2] ** lst[len(lst)-1]
for n in reversed(range(len(lst)-2)):
total = pow(lst[n], total)
return total%10
编辑:0 ^ 0 应假定为 1
【问题讨论】:
-
@MattTimmermans 那是 javascript。我不知道如何在 python 中复制它
-
您已经很好地列出了这些序列。您为什么不尝试充实您的解决方案以实际利用它们呢?在你用尽所有想法后寻找替代或最佳解决方案,序列是一个好的开始。问问自己,如何才能以某种方式在逻辑中使用它们。
-
@ParitoshSingh 并不意味着粗鲁或任何东西,但我复制的代码是一个更早的尝试,正如我在我的问题中所说,我不知道如何使用这些序列来保持循环找到正确答案
-
别担心,你们都很好。我想在这种情况下,我可以给出的一个提示是:给定起始数字,比如 8,给定 5 的幂,你会得到什么结果? 9点呢?说13?你看到模式了吗?
-
什么都没有,如果你正在解决这个问题来娱乐,你可能想看看projecteuler.net这是一个包含数百个主要需要编程来解决的娱乐性数学问题的网站。