私は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パフォーマンスの制限)に遭遇する可能性があります。
問題は、数値の平方根を見つけなければならないことです。
学部の数学の教科書(またはウィキペディア)で平方根を計算するためのアルゴリズムを見つけることができるはずです。コーディングは簡単な作業です。
(これが「宿題」のようなにおいがすることを除いて、サンプルコードを紹介します。私が見つけたコードを完全に信頼しているわけではありません。)
ほとんどの整数には不合理な平方根があることを忘れないでください...
BigIntegerクラスよりも、BigDecimalクラスを探しているか、整数だけが必要な場合は探しています。任意精度なので、入力した数値の大きさに応じてサイズが変わります
BigIntegerの平方根を見つけるには、「-StackOverflow」の回答を省略してGoogle検索を行う必要があります。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/これが1つのアルゴリズムです。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がマークに到達していません