Я работаю над 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
Есть идеи, что должно было случиться? Заранее спасибо!
3 ответа
Это потому, что вы используете целочисленную арифметику в неправильном порядке.
x *= (i - j) / (j + 1);
Такой же как
x = x * ((i - j) / (j + 1));
Скобки важны. (i - j) / (j + 1)
в большинстве случаев не является целым числом, но java все равно округляет его до целого числа.
Как вы это сделали вначале
x = x * (i - j) / (j + 1);
Умножение происходит до деления, поэтому ошибок округления не возникает.
Вы переключили высокий приоритет * на низкий * =, что привело к
x = x * ((i - j) / (j + 1));
Вместо того
x = (x * (i - j)) / (j + 1);
Что вы, вероятно, хотели.
Похоже на целочисленное деление против порядка операций. Попробуйте добавить скобки, и я думаю, вы в конечном итоге добьетесь того же результата. Если вы, скажем, разделите 2/3 на целые числа, вы получите 0. Поэтому имеет значение, если вы сначала произведете умножение.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].