int a = 1;
for (int i = 1; i <= 6; i++) {
a = a * (50 - i + 1) / i;
}
System.out.println(a); // result: 15890700
int b = 1;
for (int i = 1; i <= 6; i++) {
b *= (50 - i + 1) / i;
}
System.out.println(b); // result: 13305600
int c = 1;
for (int i = 1; i <= 6; i++) {
c *= (double) (50 - i + 1) / i;
}
System.out.println(c); // result: 15890700
运算的优先级不一样,在第一个例子加上一个大夸号,就和第二个结果一样了
int / int
是整除
3 / 2 = 1 而不是1.5
当i = 2时 会出现 49 / 2的行为,这里会少掉很多数值。
而第一种情况49要先乘a 也就是 50* 49 / 2 这个时候因为50是2的倍数 所以结果为正确的结果
3 是 48 /3 所以没事
4 是 47 / 4 但是 a能被4整除
...
总之这个循环 刚好a或者括号里的能被i整除,所以第一个结果和第三个结果一致
因为第三个 不是整除 而是将 (50 - i + 1) 转为浮点型,会出现小数
而c *= xx 相当于 c = (int) (c * xx)
由于乘法的交换律 所以第一个结果和第三个结果是一致的