web-dev-qa-db-ja.com

java:BigIntegerの場合のforループの動作

ユーザーからの入力をBig-Integerとして受け取り、それをForループに操作したい

BigInteger i;
for(BigInteger i=0; i<=100000; i++) {
    System.out.println(i);
}

しかし、それはうまくいきません

どんな体でも私を助けることができます。

25
Sanjeev

代わりに次の構文を使用します。

_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で十分です。

APIリンク


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);
_
47

さて、まず、「i」と呼ばれる2つの変数があります。

次に、ユーザー入力はどこにありますか?

3番目に、i = i + iは、iをプリミティブ値にアンボックス化し、おそらくオーバーフローし、結果を新しいオブジェクトにボックス化します(つまり、ステートメントがコンパイルされても、まだチェックしていません)。

第4に、i = i + iはi = i.multiply(BigInteger.valueof(2))のように記述できます。

5番目に、100000 <= 1はfalseであるため、ループは実行されません。

3
Justin K

このコードはうまくいくと思います

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);
    }
}
1
vodkhang