@ironmansl

Как вывести первые N элементов последовательности 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...?

Есть такая задача:
Дана последовательность, в которой каждое натуральное число k встречается ровно k раз: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...
По данному натуральному n выведите первые n членов этой последовательности. Попробуйте обойтись только одним циклом for.

Самое сложное для меня в этой задаче то, что я не знаю как задать условие (какую формулу использовать в условии). Как это сделать?
  • Вопрос задан
  • 1006 просмотров
Решения вопроса 3
0xD34F
@0xD34F
Допустим, выведены единица и все двойки: 1, 2, 2 - всего 1 + 2 = 3 числа. А если единица, двойки и все тройки: 1, 2, 2, 3, 3, 3 - всего 1 + 2 + 3 = 6 чисел. Если добавить четвёрки: 1 + 2 + 3 + 4 = 10 чисел. Ну и так далее - это сумма арифметической прогрессии. Если текущее значение счётчика цикла равно сумме натуральных чисел от 1 до текущего выводимого - начинаем выводить следующее число:

const N = чему-то там равно;

for (let i = 1, num = 1; i <= N; i++) {
  console.log(num);
  if (i === (1 + num) * num / 2) {
    num++;
  }
}

UPD. Можно пойти чуть дальше, и вспомнить про квадратные уравнения - в коде выше, в условном операторе, это вот оно. Известно значение счётчика - надо найти число. Так что нет проблем и формулу элемента последовательности вывести:

for (let i = 1; i <= N; i++) {
  console.log(Math.ceil((Math.sqrt(1 + 8 * i) - 1) / 2));
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
let number = 1;
let count = 1;
for (let i = 1; i <= n; i++) {
  console.log(number);
  if (0 == --count) {
    count = ++number;
  }
}
Ответ написан
@ukbpyh
Если не использовать формулы арифметических прогрессий:

Рекурсивная функция:

function kn(n,k = 1) {
    for (let i = 1; (i <= k) && (n > 0); i++) {
        console.log(k);
        --n;
    }
    if (n > 0) return kn(n,++k);
}

kn(8); // для первых восьми чисел n

или без неё:

n = 8;

for (let i = 1, k = 1; n > 0; i++) {
    console.log(k);
    --n;
    if (i == k) {
        k++;
        i = 0;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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