【发布时间】:2021-11-12 01:13:59
【问题描述】:
在 Python 中,我试图找出一个数字的最后三位数字,该数字是 2^(a^b) 的结果,其中 a 和 b 作为输入值。它可以处理高达 6、6 的输入值而不会减慢速度,但是一旦达到 7、7 就会变得非常慢,而 8、8 就不起作用了。我想知道是否有某种数学捷径或其他东西可以更快地获得最后三位数。另外,我对堆栈溢出有点陌生,所以我不知道我是否在正确的地方问这个问题。另外,如果这改变了任何东西,我正在使用 replit。 (这是给学校的,我非常感谢帮助)
def last_three(a, b):
num = 2 ** (a ** b)
string = str(num)
length = len(string)
print (length)
new_string = ''
new_string += string[length - 3]
new_string += string[length - 2]
new_string += string[length - 1]
return int(new_string)
【问题讨论】:
-
这不是真正的编程问题;你应该知道一个更好的方法来做到这一点,而不是仅仅计算整数并丢弃其余的。当然,您可以先执行此操作,而无需先构造全长字符串...
-
我投票结束这个问题,因为它基本上是一个数学问题,而不是一个编程问题。请尝试math.stackexchange.com。
-
不同意。所有必要的数学都包含在
num = 2 ** (a ** b)行中,并且已经在其中。找到最后三位数字对我来说似乎是一个编程问题。 OP 清楚地说明了他的困惑,即 6、6 有效而 8、8 无效。同样,编程不是数学问题。他为手头的问题选择了一个糟糕的算法,这可以用编程术语来解释。 -
我怀疑这是一个数学问题,否则根本就不是一个有趣的问题。例如,尝试计算 2^(10000000000 ^ 10000000000) mod 1000。诀窍在于了解 Euler totient 函数的工作原理(或者,Carmichael 的 lambda 函数)
-
@PresidentJamesK.Polk 我昨天做了那个,尽管通过一个小程序发现 2^3 和 2^103 是模 1000 的全等。所以我可以用
pow(2, (pow(10**10, 10**10, 100) - 3) % 100 + 3, 1000)计算结果。不过,我很难概括这一点。我不能做pow(2, (pow(a, b, 100) - 3) % 100 + 3, 1000),因为如果a**b小于3,那就错了。我想我可以做一些if else看看a和b,但这感觉不优雅。你有更好的建议吗?