Пытаюсь решить задачу:
Напишите программу, которая выводит часть последовательности 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) + ' ')*i print(b[0:a*2])
Ваша ошибка в том, что в последнем операторе Вы обрезаете результирующую строку, предполагая, что содержащиеся в ней числа имеют длину в один символ. Но это, естественно, не так. Чтобы избежать этой ошибки, можно, например, использовать списки:
v = [] for i in range(1, n+1): v += [str(i)] * i print(" ".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: break print(" ".join(v))
Не теряя эффективности, но выигрывая в понятности, можно немножко поиграть с генераторами (не путать с генераторами списков!):
def generator(m): c = 0 for i in range(1, m+1): for j in range(i): c += 1 if c > m: return yield str(i) print(" ".join(generator(n)))
Чтобы напечатать n
чисел из последовательности, удобно itertools
использовать:
#!/usr/bin/env python3 import itertools def generate(): for i in itertools.count(1): yield from [str(i)] * i n = int(input('Enter n: ')) print(*itertools.islice(generate(), n))
Пример:
Enter n: 7 1 2 2 3 3 3 4
Вариант решения через while:
n = int(input('Enter number:')) count1 = 1 count2 = 0 num_print = () globul_count = 0 while globul_count != n: num_print = count1 while count2 < count1: count2 += 1 print(num_print, end=' ') globul_count += 1 if globul_count == n : break continue count1 += 1 count2 = 0