我正在开发一个关于pascal三角形的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
知道发生了什么事吗?提前谢谢!
答案 0 :(得分:13)
这是因为您使用了错误顺序的整数运算。
x *= (i - j) / (j + 1);
与
相同x = x * ((i - j) / (j + 1));
括号很重要。 (i - j) / (j + 1)
在大多数情况下不是一个整数,但无论如何,java将它舍入为整数。
你先做的方式
x = x * (i - j) / (j + 1);
乘法发生在除法之前,因此不会出现任何舍入误差。
答案 1 :(得分:5)
您将高优先级*切换为低优先级* =导致
x = x * ((i - j) / (j + 1));
代替
x = (x * (i - j)) / (j + 1);
你可能想要的。
答案 2 :(得分:2)
看起来像整数除法与操作顺序。尝试添加一些括号,我想你最终会得到相同的结果。如果你把整数除以2/3,你得到0.所以如果你先做一些乘法就很重要。