0

私はパスカルの三角形に関する Java プログラムに取り組んでいます。

したがって、これはコード化されている方法です:

for(int i = 0; i < 5; i++){
    for(int j = 0, x = 1; j <= i; j++){
        System.out.print(x + " ");
        x = x * (i - j) / (j + 1);
    }
    System.out.println();
}

1
1
1
1 2 1
1 3 3 1
1 4 6 4 1

しかし、コードを次のように変更しようとしたとき:

for(int i = 0; i < 5; i++){
    for(int j = 0, x = 1; j <= i; j++){
        System.out.print(x + " ");
        x *= (i - j) / (j + 1);
    }
    System.out.println();
}

お気づきかもしれませんが、演算子のみが *= に変更されていますが、結果は次のようになります。

1
1 1
1 2 0
1 3 3 0
1 4 4 0 0

何が起こったに違いないのですか?前もって感謝します!

4

3 に答える 3

13

これは、整数演算を間違った順序で使用しているためです。

x *= (i - j) / (j + 1);

と同じです

x = x * ((i - j) / (j + 1));

角かっこは重要です。 (i - j) / (j + 1)ほとんどの場合、整数ではありませんが、Javaはとにかくそれを整数に丸めます。

あなたが最初にそれをした方法

x = x * (i - j) / (j + 1);

乗算は除算の前に行われるため、丸め誤差は発生しません。

于 2009-11-26T14:10:51.947 に答える
5

高い優先順位を*低い優先順位に切り替えました*=結果として

x = x * ((i - j) / (j + 1)); 

それ以外の

x = (x * (i - j)) / (j + 1);

あなたはおそらくそれを望んでいました。

于 2009-11-26T14:13:29.057 に答える
2

整数除算と演算の優先順位のように見えます。かっこを追加してみてください。最終的には同じ結果が得られると思います。たとえば、2/3を整数で割ると、0になります。したがって、最初に乗算を行うかどうかが重要になります。

于 2009-11-26T14:09:53.277 に答える