【问题标题】:How to I find the last three digits of a number that is the result of 2^(a^b)如何找到作为 2^(a^b) 结果的数字的最后三位
【发布时间】: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 看看ab,但这感觉不优雅。你有更好的建议吗?

标签: python math shortcut


【解决方案1】:

我意识到方程式并不是慢的部分,而是我将其转换为字符串、查找长度并索引最后 3 位的事实。

其中一位 cmets 告诉我要执行 2**(a**b) % 1000 以获得解决方案,并且成功了。

感谢大家的反馈。

【讨论】:

  • pow(2, (a**b), 1000) 会工作得更快。
  • 小心。在 python 中,就像在大多数编程语言中一样,a^b not 表示“a 的 b 次方”。它的意思是“按位异或 b”,这与您想要的完全无关。在 python 中,使用a**bpow(a, b) 得到“a 的 b 次方”。
  • 我想坚持@bb1 的评论。 pow(2, (a**b), 1000) 不仅比 2 ** (a**b) % 1000 快一点。它效率更高。特别是如果ab 很大,2 ** (a ** b) 可以是一个巨大 的数字,而2 ** (a**b) % 1000 的结果总是一个很小的数字(小于 1000)。有一些技巧可以仅使用小数字来计算这个小数字,这比计算大数字2 ** (a ** b) 效率更高。 Python 的内置函数pow 利用了这些技巧。
  • @Stef 你说“小数(小于 1000)”,然后“只使用小数”。你的意思是它完全只使用小于 1000 的数字吗?我想它会在一段时间内上升到 999^2,然后立即将其取模回落到 1000 以下。但我想它可能会一直保持在 1000 以下,所以我不确定。跨度>
  • @KellyBundy 我已经有一年没有研究过这类算术了,所以,不,我不能保证所有被操纵的数字都小于 1000。但与 @987654334 相比,它们肯定很小@。在这种情况下,上升到999**2 听起来很合理;虽然如果我们将 1000 替换为 2**32,其中 32 是计算机上的字长,那么我想在计算 2**(a**b) % 2**32 时只操作小于 2**32 的数字是可取的。
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多