ユーザーからの入力をBig-Integerとして受け取り、それをForループに操作したい
BigInteger i;
for(BigInteger i=0; i<=100000; i++) {
System.out.println(i);
}
しかし、それはうまくいきません
どんな体でも私を助けることができます。
代わりに次の構文を使用します。
_BigInteger i = BigInteger.valueOf(100000L); // long i = 100000L;
i.compareTo(BigInteger.ONE) > 0 // i > 1
i = i.subtract(BigInteger.ONE) // i = i - 1
_
これをまとめた例を次に示します。
_ for (BigInteger bi = BigInteger.valueOf(5);
bi.compareTo(BigInteger.ZERO) > 0;
bi = bi.subtract(BigInteger.ONE)) {
System.out.println(bi);
}
// prints "5", "4", "3", "2", "1"
_
BigInteger
をループインデックスとして使用することは非常に一般的ではないことに注意してください。通常、この目的にはlong
で十分です。
compareTo
イディオムドキュメントから:
このメソッドは、6つのブール比較演算子(_
<
_、_==
_、_>
_、_>=
_、_!=
_、_<=
_)。これらの比較を実行するための推奨されるイディオムは次のとおりです:(x.compareTo(y)
_<op>
__0
_)、ここで_<op>
_は6つのうちの1つです比較演算子。
つまり、_BigInteger x, y
_が与えられた場合、これらは比較イディオムです。
_x.compareTo(y) < 0 // x < y
x.compareTo(y) <= 0 // x <= y
x.compareTo(y) != 0 // x != y
x.compareTo(y) == 0 // x == y
x.compareTo(y) > 0 // x > y
x.compareTo(y) >= 0 // x >= y
_
これはBigInteger
に固有のものではありません。これは、一般的にどの _Comparable<T>
_ にも当てはまります。
BigInteger
は、String
と同様、不変オブジェクトです。初心者は次の間違いをする傾向があります:
_String s = " hello ";
s.trim(); // doesn't "work"!!!
BigInteger bi = BigInteger.valueOf(5);
bi.add(BigInteger.ONE); // doesn't "work"!!!
_
これらのメソッドは不変であるため、呼び出されたオブジェクトを変更せず、代わりにそれらの操作の結果である新しいオブジェクトを返します。したがって、正しい使い方は次のようなものです。
_s = s.trim();
bi = bi.add(BigInteger.ONE);
_
さて、まず、「i」と呼ばれる2つの変数があります。
次に、ユーザー入力はどこにありますか?
3番目に、i = i + iは、iをプリミティブ値にアンボックス化し、おそらくオーバーフローし、結果を新しいオブジェクトにボックス化します(つまり、ステートメントがコンパイルされても、まだチェックしていません)。
第4に、i = i + iはi = i.multiply(BigInteger.valueof(2))のように記述できます。
5番目に、100000 <= 1はfalseであるため、ループは実行されません。
このコードはうまくいくと思います
public static void main(String[] args) {
BigInteger bigI = new BigInteger("10000000");
BigInteger one = new BigInteger("1");
for (; bigI.compareTo(one) == 0; bigI.subtract(one)) {
bigI = bigI.add(one);
}
}