вывести часть последовательности 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]) Ваша ошибка в том, что в последнем операторе Вы обрезаете результирующую строку, предполагая, что содержащиеся в ней числа имеют длину в один символ. Но это, естественно, не так. Чтобы избежать этой ошибки, можно, например, использовать списки:
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))) Войдите чтобы оставить ответ