【问题标题】:Compute x to x power in the most optimal way possible [duplicate]以尽可能最优的方式计算 x 到 x 的幂 [重复]
【发布时间】:2011-09-11 18:33:41
【问题描述】:

可能重复:
The most efficient way to implement an integer based power function pow(int, int)

我知道这个问题很简单,但我的要求是我想以可能的最佳优化方式计算 x 到 x 的幂,其中 x 是一个非常大的数字。我不是数学极客,因此需要一些帮助来找出可能的最佳方法。

在java中,我们可以使用BigInteger,但是如何优化代码呢?有什么具体的优化方法吗?

同样使用递归会不会x的值很大,导致代码变慢,容易出现栈溢出错误?

例如:457474575 提升到权力 457474575

【问题讨论】:

  • @learner,最好的? ...认真的吗?
  • 您可以计算出 2 的所有幂到 x 并乘以所有加起来为 x 的 2 的幂。即使你使用递归,你也不会得到超过 log2(log2(x)) 级别的递归。
  • 你打算如何表示答案?你给出的计算将有数十亿位数。你都需要吗?
  • @learner,字符串中不能包含 3,961,897,695 个数字。
  • x 总是一个整数,还是也可以是一个浮点数?您需要完全精确的答案,还是只需要数量级?

标签: java c++ c algorithm logic


【解决方案1】:

您确实意识到您的示例的答案将是一个非常大的数字,即使对于 BigInteger 也是如此?它将有 3961897696 个数字!

如果您不需要精确的精度,处理非常大的数字的最佳方法是使用它们的对数。要取 x 的 x 次方,请取 x 的对数并将其乘以 x。如果您需要将其转换回将 e 转换为 x exp(x),除非在这种情况下它几乎肯定会溢出。

【讨论】:

  • +1:Java 中的字符串不能这么长。 ;)
  • +1。我写了基本相同的答案(并再次删除它)
  • pow(x,x) -- 赋予术语任意精度算术新的含义!
  • 你们怎么计算得这么精确?
  • @Martijn Courteaux,整数的 log10 表示,四舍五入,是位数。例如。 log10(1234) 为 3.091,四舍五入为 4。
【解决方案2】:

这是最简单的优化方法之一:

x^1*x^1=x^2
x^2*x^2=x^4
etc...
x^x = x^(x/2)*x^(x/2)*remainder

【讨论】:

    【解决方案3】:

    ((BigInteger) 457474575).pow(457474575);

    【讨论】:

    • +1:你不能转换成 BigInteger,你只能做 Integer.MAX_VALUE 的幂,但我喜欢你的想法。
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2020-08-05
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多