2016-05-11 3 views
0

私のプログラムは、パスカルの三角形を表示します。計算や表示が可能な三角形の部分を拡大するために、私はプリミティブ型の代わりにBigIntegerを使ってコードを書き直しました。BigIntegerを使用しているプログラムで何も表示されないのはなぜですか?

import java.math.BigInteger; 

public class ptrig { 
public static void main(String args[]) { 
    BigInteger no = BigInteger.valueOf(5); 

    // Creating the array 
    String doubledim[][] = new String[no.intValue()][]; 
    BigInteger k; 
    for (k = BigInteger.ZERO; k.compareTo(no) < 0; k.add(BigInteger.ONE)) { 
     doubledim[k.intValue()] = new String[k.intValue() + BigInteger.ONE.intValue()]; 
    } 

    // Assigning values 
    BigInteger i, j, p, n; 
    BigInteger l = BigInteger.ONE; 
    for (i = BigInteger.ZERO; i.compareTo(no) < 0; i.add(BigInteger.ONE)) { 
     for (j = BigInteger.ZERO; j.compareTo(i.add(BigInteger.ONE)) < 0; j.add(BigInteger.ONE)) { 
      BigInteger m = i.subtract(j); 
      if (j.compareTo(m) > 0) { 
       for (p = BigInteger.ZERO; p.compareTo(m) < 0; p = p.add(BigInteger.ONE)) { 
        n = i.subtract(p); 
        l = l.multiply(n); 
       } 
       doubledim[i.intValue()][j.intValue()] = l.divide(factorial.factmet(m)).toString(); 
       l = BigInteger.ONE; 
      } 
      if (m.compareTo(j) > 0) { 
       for (p = BigInteger.ZERO; p.compareTo(j) < 0; p = p.add(BigInteger.ONE)) { 
        n = i.add(p.add(BigInteger.ONE)).subtract(j); 
        l = l.multiply(n); 
       } 
       doubledim[i.intValue()][j.intValue()] = l.divide(factorial.factmet(j)).toString(); 
       l = BigInteger.ONE; 
      } 
      if (m.compareTo(j) == 0) { 
       for (p = BigInteger.ZERO; p.compareTo(j) < 0; p = p.add(BigInteger.ONE)) { 
        n = i.subtract(p); 
        l = l.multiply(n); 
       } 
       doubledim[i.intValue()][j.intValue()] = l.divide(factorial.factmet(j)).toString(); 
       l = BigInteger.ONE; 
      } 
     } 
    } 

    // Printing 
    for (i = BigInteger.ZERO; i.compareTo(no) < 0; i.add(BigInteger.ONE)) { 
     for (j = BigInteger.ZERO; j.compareTo(i.add(BigInteger.ONE)) < 0; j.add(BigInteger.ONE)) { 
      System.out.print(doubledim[i.intValue()][j.intValue()] + " "); 
     } 
     System.out.println(); 
    } 
} 
} 

問題は、それは何も表示されませんです:

は、ここでは、コードです。私はスタックオーバーフローを読んだ。私は配列の値を文字列に変換して表示する必要があるので、私はそうした。私もSystem.out.printlnのステートメントをチェックしました - 彼らはうまくいくようです。エラーは継続されました。

プリミティブ型の以前のバージョンでは、アルゴリズム自体が正常に機能しました。

ここでは何が違うのですか?私はウェブ上で答えを見つけるために最善を尽くした、私はできなかった。ありがとう。

+2

デバッガのコードをステップ実行して、期待したことができない箇所を確認することをお勧めします。 –

+0

'j Andreas

+0

ええ、それは同じです。私は最初にそれを書いたときにそれをi + 1と考えていましたが、その後は変わっていませんでした。ありがとう。 – user6232516

答えて

1

あなたのfor-loopsはインデックスをインクリメントしていませんので、forforループは永遠にループします。

i.add(BigInteger.ONE)iであり、それはcreates a newBigInteger and returns itである。あなたがiの値をインクリメントしたい場合は、これはあなたの配列を初期化しようとしたとき、あなたは永遠にdoubledim[0]を再初期化無限ループを、入力していることを意味i = i.add(BigInteger.ONE)


記述する必要があります。

for (k = BigInteger.ZERO; k.compareTo(no) < 0; k.add(BigInteger.ONE)) { 
    doubledim[k.intValue()] = new String[k.intValue() + BigInteger.ONE.intValue()]; 
} 

for (k = BigInteger.ZERO; k.compareTo(no) < 0; k = k.add(BigInteger.ONE)) { 
    doubledim[k.intValue()] = new String[k.intValue() + BigInteger.ONE.intValue()]; 
} 

であるべきで、あなたは同様にあなたの配列内のデータの人口、後であなたのプログラムでのデータの印刷を制御ループを修正する必要があります。

+0

ありがとうございます。それを各ループで行い、ダブルチェックしました。残念ながら、それは役に立たなかった。 – user6232516

+0

すべてのループを修正し、自分の 'factorial.factmet()'メソッドをハックすると、あなたのコードはうまく動作します。すべてのfor-loopsを三重にチェックすることをお勧めします。 – azurefrog

+0

これは私が忘れた方法のループです。これで問題は解決しました。 – user6232516

関連する問題