1

コンパイル時にエラーは発生しませんが、実際には FACTOR ではありません! ただし、実行されていることを確認するためにそこに入力した「テスト」行が出力されます。コードは次のとおりです。

    import java.math.BigInteger;

public class test {   
public static void main(String[] Args) {

System.out.println("Testing");

BigInteger a=BigInteger.valueOf(99);
BigInteger i=BigInteger.valueOf(1);

while (i.compareTo(a) < 0 ) {

  if ((a.mod(i)) == BigInteger.ZERO) {
  System.out.println(i);
  i=i.add(BigInteger.ONE);}

  else {i=i.add(BigInteger.ONE);}
 }
  }
}

これは宿題ではありません。私は 64 ビットより大きいものを因数分解しようとしているオタクです! 私は大学で Java ではなく VB を取ったので、今日まで BigInteger を使ったことがありません。

4

2 に答える 2

2

あなたが与えた正確なコードを OpenJDK 7 で実行してみましたが、次の出力が得られました。

Testing
1
3
9
11
33

JRE の BigInteger の実装は、既存のインスタンスを再利用するのではなく、ゼロの BigIntegers の新しいインスタンスを作成する可能性がありBigInteger.ZEROます。オブジェクトを比較する.equals()代わりに使用する必要があります。==これは、ゼロのインスタンスが 2 つある場合でも機能するはずです。

于 2012-11-04T06:30:22.260 に答える
1

また、全体をループしないことを強くお勧めしますBigInteger a。代わりに、その値の半分だけをループする必要があります。これは、任意の数Nに対してN /2 が可能な最大の因数であるためです。より最適化されたコードは次のようになります。

BigInteger maxFactor = a.divide(new BigInteger("2"));
while (i.compareTo(maxFactor) <= 0 ) {
  if ((a.mod(i)).equals(BigInteger.ZERO))
    System.out.println(i);
  i=i.add(BigInteger.ONE);
}

少しの数論を使ってヒープをさらに最適化することはできますが、私はそれを実際に助けることはできません.

于 2012-11-04T06:37:17.950 に答える