TL; DR
Цикл будет выполняться для ((total ^ 3) - total) / 6
раз, и, следовательно, это будет значение sum
в конце цикла.
int sum = 0;
for(int i = 0; i < total; i++) {
for(int j = i + 1; j < total; j++) {
for(int k = j; k < total; k++) {
sum++;
}
}
}
Легко видеть, что внешний цикл работает total
раз. Второй цикл сложнее
Давайте попробуем решить это
i = 0
, j
работает с 1..total - 1
i = 1
, j
работает с 2..total - 1
i = 2
, j
работает с 3..total - 1
...
i = total - 2
, j
запускается с total - 1 ..total - 1
(будет запускаться только один раз)
i = total - 1
, внутренний цикл не выполняется, поскольку условие завершения цикла выполняется.
Третий цикл зависит от второго внутреннего цикла - k
начинается с j..total - 1
Давайте возьмем всего 6
j
выполняется из 1..5
-> k
выполняется 5 раз (j = 1
) + 4 раза (j = 2
) + 3 раза (j = 3
) + 2 раза (j = 4
) + 1 раз (j = 4
)
(Отображение минифицированной версии для других)
2..5 -> 4+3+2+1
3..5 3+2+1
4..5 2+1
5..5 1
Что такое
1 + 2 + 3 + 4 + 5+
1 + 2 + 3 + 4 +
1 + 2 + 3 +
1 + 2 +
1
Вообще,
1 + 2 + 3 + .. n +
1 + 2 + 3 +..n - 1+
1 + 2 + 3 +..n - 2+
1 + 2 + 3 +
1 + 2 +
1
Это сводится к сумме
n * (n - 1)) / 2
Для все значения из n
в диапазоне от 1 to total
Это можно проверить с помощью приведенного ниже
int res = 0;
for (int i = 1; i <= total; i++) {
res += (i * (i - 1))/2;
}
res
будет равно вашему sum
.
Математически, выше
((total ^ 3) - total) / 6
Вывод:
Ссылка:
Суммы первых русских натуральных чисел
Сумма квадратов первых русских натуральных чисел