BigInteger.pow(BigInteger的)?

Pet*_*erW 21 java math biginteger pow

我正在玩Java中的数字,想看看我能做多少.我的理解是BigInteger可以容纳一些无限大小,只要我的计算机有足够的内存来容纳这样的数字,对吗?

我的问题是BigInteger.pow只接受一个int,而不是另一个BigInteger,这意味着我只能使用一个最多2,147,483,647的数字作为指数.是否可以使用BigInteger类?

BigInteger.pow(BigInteger)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Kei*_*all 22

您可以使用重复的平方来编写自己的:

BigInteger pow(BigInteger base, BigInteger exponent) {
  BigInteger result = BigInteger.ONE;
  while (exponent.signum() > 0) {
    if (exponent.testBit(0)) result = result.multiply(base);
    base = base.multiply(base);
    exponent = exponent.shiftRight(1);
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

可能不适合负面基础或指数.

  • +1表示有可能(即使这可能不是一个好主意) (3认同)
  • @Saeed,他没有问为什么BigInteger.pow就是这样,他问是否有可能使用更大的指数. (2认同)
  • @HendraWijayaDjiono:结果中有 ~10^18 位数字。为您的计算机加载 100 万 TB 的 RAM,然后重试... (2认同)

Rau*_*ene 11

您只能通过模块化算法在Java中执行此操作,这意味着您可以执行a ^ b mod c,其中a,b,cBigInteger数字.

这是使用:

 BigInteger modPow(BigInteger exponent, BigInteger m) 
Run Code Online (Sandbox Code Playgroud)

阅读BigInteger.modPow此处的文档.


Pet*_*rey 9

BigInteger的底层实现仅限于(2 ^ 31-1)*32位值.这几乎是2 ^ 36位.您将需要8 GB的内存来存储它,很多时候,这对像的toString执行任何操作().

顺便说一句:你永远无法读到这样的数字.如果您试图将其打印出来,则需要一生的时间来阅读它.


Abr*_*dam 1

java 不会让您执行 BigInteger.Pow(BigInteger) 但您可以将其放入循环中的最大整数,然后查看在何处抛出 ArithmeticException 或由于内存不足而引发的其他错误。