我正在使用 java 并且必须处理大于 long 的数字(即 64 位)。我应该使用什么?Java中BigInteger的大小是多少?
5 回答
正如您在问题中提到的,您应该使用BigInteger。
它们可以根据您的需要变大 - 直到内存不足。
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 性能限制)。
问题是我必须找出数字的平方根。
您应该能够在本科数学教科书(或维基百科)中找到计算平方根的算法。编码它应该是一项简单的任务。
(我会向您指出示例代码,除了这闻起来像“家庭作业”,而且我并不完全相信我找到的代码。)
不要忘记大多数整数都有一个无理平方根......
您正在寻找 BigDecimal 类,或者如果您只需要整数,而不是 BigInteger。它的任意精度,因此大小会根据您输入的数字大小而变化
要找到 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);
}
导入 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没有达到标准