Avatar ·

вывести часть последовательности 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 на python 3

📁 python, пример, работа

Пытаюсь решить задачу:

Напишите программу, которая выводит часть последовательности 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 ... (число повторяется столько раз, чему равно). На вход программе передаётся положительное целое число n — столько элементов последовательности должна отобразить программа. На выходе ожидается последовательность чисел, записанных через пробел в одну строку.

Например, если n = 7, то программа должна вывести 1 2 2 3 3 3 4.

Sample Input: 7

Sample Output: 1 2 2 3 3 3 4

Вот что получается, проблема в том что на больших числах не работает.

a=int(input())b=''for i in range(a+1):    b = b + (str(i) + ' ')*iprint(b[0:a*2])
Avatar ·

Ваша ошибка в том, что в последнем операторе Вы обрезаете результирующую строку, предполагая, что содержащиеся в ней числа имеют длину в один символ. Но это, естественно, не так. Чтобы избежать этой ошибки, можно, например, использовать списки:

v = []for i in range(1, n+1):    v += [str(i)] * iprint("" "".join(v[:n]))

Используя генераторы списков, всё это можно записать в одну строку:

print("" "".join([str(i) for i in range(1, n+1) for j in range(i)][:n]))

Правда, весь вышеприведённый код неэффективный, поскольку генерирует существенно больше данных, чем нужно для вывода на экран.

А вот более эффективный код, который генерирует ровно столько данных, сколько нужно:

v = []for i in range(1, n+1):    c = min(n, i)    n = n - c    v += [str(i)] * c    if n <= 0:        breakprint("" "".join(v))

Не теряя эффективности, но выигрывая в понятности, можно немножко поиграть с генераторами (не путать с генераторами списков!):

def generator(m):    c = 0    for i in range(1, m+1):        for j in range(i):            c += 1            if c > m:                retu            yield str(i)print("" "".join(generator(n)))

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

Блоги