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 回答