17

我正在使用 java 并且必须处理大于 long 的数字(即 64 位)。我应该使用什么?Java中BigInteger的大小是多少?

4

5 回答 5

20

正如您在问题中提到的,您应该使用BigInteger

它们可以根据您的需要变大 - 直到内存不足。

于 2012-04-07T02:51:23.230 回答
3

Java中BigInteger的大小是多少?

这有点棘手。问题是 javadocs 中没有明确的限制规范。

  • 该类使用一个int[]来表示幅度。这意味着它可能代表高达((2^32)^(2^31 - 1).

  • API 有一个方法可以将数字作为 2 的补码字节数组返回。对此的限制是((2^8)^(2^31 - 1)

  • API 有另一种方法,它以位为单位返回数字的大小......作为int. 这意味着限制2^(2^31 - 1)或可能2^(2^32)

实际上,这些数字都非常大,以至于您可能首先会遇到堆空间限制(或 CPU 性能限制)。


问题是我必须找出数字的平方根。

您应该能够在本科数学教科书(或维基百科)中找到计算平方根的算法。编码它应该是一项简单的任务。

(我会向您指出示例代码,除了这闻起来像“家庭作业”,而且我并不完全相信我找到的代码。)

不要忘记大多数整数都有一个无理平方根......

于 2012-04-07T03:19:44.813 回答
2

您正在寻找 BigDecimal 类,或者如果您只需要整数,而不是 BigInteger。它的任意精度,因此大小会根据您输入的数字大小而变化

于 2012-04-07T02:52:19.813 回答
0

要找到 BigInteger 的平方根,您必须在 google 搜索中省略“-StackOverflow”答案。https://www.google.com/search?q=java+extract+root+bignum&ie=utf-8&oe=utf-8#q=java+root+BigInteger+-stackoverflow.com+-stackexchange.com产生第一个链接到http://faruk.akgul.org/blog/javas-missing-algorithm-biginteger-sqrt/这是一种算法。Java 应该是“一次编写,到处使用”。好吧,一些 SO 用户认为您必须重新发明轮子。要求他们提供一个模块,他们的回答是“闻起来像家庭作业,自己做”。是的,BigInteger 是半生不熟的。它不能开箱即用地做对数或求根。它非常慢。算法如下。

BigInteger sqrt(BigInteger n) {
  BigInteger a = BigInteger.ONE;
  BigInteger b = new BigInteger(n.shiftRight(5).add(new BigInteger("8")).toString());
  while(b.compareTo(a) >= 0) {
    BigInteger mid = new BigInteger(a.add(b).shiftRight(1).toString());
    if(mid.multiply(mid).compareTo(n) > 0) b = mid.subtract(BigInteger.ONE);
    else a = mid.add(BigInteger.ONE);
  }
  return a.subtract(BigInteger.ONE);
}
于 2016-06-27T13:08:19.907 回答
-3

导入 java.util.Scanner;导入 java.math.BigDecimal;

公共课 Ha40 {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int i = scan.nextInt();
    long d=scan.nextLong();
    String st=" ";
    st=scan.next();
    st+= scan.nextLine();
    // Write your code here.

    System.out.println("String: " + st);
    System.out.println("Double: " + d);
    System.out.println("Int: " + i);
}

}

输入是:2147483647 235345345345.234534 fsdfsdf sdf 但ans没有达到标准

于 2018-03-20T03:09:01.973 回答