需要超过64位表示的大数字

时间:2012-04-07 02:49:44

标签: java biginteger

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

5 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分: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性能限制)。


  

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

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

(我会指出你的示例代码,除了这有点像“家庭作业”,我并不完全信任我找到的代码。)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

要查找BigInteger的平方根,您必须使用“-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);
}

答案 4 :(得分:-2)

import java.util.Scanner; import 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没有达到标记