@Hi-Pyncho

Как работает эта часть алгоритма?

Есть такая задача:

Один мой друг берет последовательность чисел от 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)

Здесь применяется конкретная математическая формула?
Заранее спасибо за ответ!
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Пусть S = 1 + 2 + ... + n.
Тогда, по условию задачи,
a · b = S - a - b
Зафиксируем a и решим уравнение относительно b:
a · b + b = S - a
(a + 1) · b = S - a
b = (S - a) / (a + 1)
Вот и получилась ваша формула.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы