Есть такая задача:
Один мой друг берет последовательность чисел от 1 до n (где n > 0).
В этой последовательности он выбирает два числа-а и Б.
Он говорит, что произведение a и b должно быть равно сумме всех чисел в последовательности, исключая a и b.
Учитывая число n, не могли бы вы сказать мне, какие числа он исключил из последовательности?
Функция принимает параметр: n (n всегда строго больше 0) и возвращает массив или строку (в зависимости от языка) формы:
[(а, б)...] или [[a, b],...] или {{a, b}, ...} или или [{a, b},...]
Примеры тестов:
Test.assertSimilar(removeNb(26), [[15,21], [21,15]]);
Test.assertSimilar(removeNb(100), []);
Я решил задачу, но со сложность алгоритма O(n**2). Поломал голову какое-то время, как улучшить алгоритм, потом полез в интернет и нашел такое решение.
function removeNb(n){
const sum = (n + 1) * n / 2
const chosenNums = []
for(let i = n; i >= 1; i--){
let tempNum = (-i + sum) / (i + 1)
if(tempNum % 1 == 0 && tempNum <= n) {
chosenNums.push([tempNum, i])
}
}
return chosenNums
}
Меня интересует строчка
let tempNum = (-i + sum) / (i + 1)
Здесь применяется конкретная математическая формула?
Заранее спасибо за ответ!