То, что у вас есть, кажется мне довольно ясным, если честно. По общему признанию, я бы поместил операторы return в фигурные скобки, поскольку это соглашение, которому я следую, но кроме этого оно выглядит так же хорошо, как и получается.
Я думаю, что я бы, вероятно, изменил порядок второго цикла, чтобы оба цикла были восходящими.
Как говорит Грег, если вам нужно получить точные ответы для больших чисел, вам следует рассмотреть альтернативные типы данных. Учитывая, что результатом всегда должно быть целое число, вы можете выбрать BigInteger
(несмотря на все деления, результатом всегда будет целое число):
public static BigInteger choose(int x, int y) {
if (y < 0 || y > x)
return BigInteger.ZERO;
if (y == 0 || y == x)
return BigInteger.ONE;
BigInteger answer = BigInteger.ONE;
for (int i = x - y + 1; i <= x; i++) {
answer = answer.multiply(BigInteger.valueOf(i));
}
for (int j = 1; j <= y; j++) {
answer = answer.divide(BigInteger.valueOf(j));
}
return answer;
}
person
Jon Skeet
schedule
05.11.2009