На самом деле это хороший вопрос, который нужно задать на собеседовании, поскольку он достаточно прост, чтобы вы могли записать его на белой доске, но достаточно сложен, чтобы он мог кого-то сбить с толку, если он не подумает об этом. Кроме того, вы также можете получить два разных ответа, из-за которых реализация будет совершенно разной.
Вопросы заказа
Если порядок имеет значение, то любое решение должно допускать появление нуля для любой из переменных; Таким образом, наиболее прямолинейное решение будет следующим:
public class Combos {
public static void main() {
long counter = 0;
for (int a = 0; a <= 500; a++) {
for (int b = 0; b <= (500 - a); b++) {
for (int c = 0; c <= (500 - a - b); c++) {
for (int d = 0; d <= (500 - a - b - c); d++) {
counter++;
}
}
}
}
System.out.println(counter);
}
}
Что возвращает 2656615626.
Порядок не имеет значения
Если порядок не имеет значения, то решение не намного сложнее, поскольку вам просто нужно убедиться, что ноль невозможен, если сумма уже не найдена.
public class Combos {
public static void main() {
long counter = 0;
for (int a = 1; a <= 500; a++) {
for (int b = (a != 500) ? 1 : 0; b <= (500 - a); b++) {
for (int c = (a + b != 500) ? 1 : 0; c <= (500 - a - b); c++) {
for (int d = (a + b + c != 500) ? 1 : 0; d <= (500 - a - b - c); d++) {
counter++;
}
}
}
}
System.out.println(counter);
}
}
Что возвращает 2573155876.