1

Тема: Задачки

Прихований текст

Напишите программу, которая выводит часть последовательности 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.

І знову ж не робочий код . . . = (

import itertools
s = int(input())
z = []
for a in range(1,s+1):
    f = list((str(a))*a)
    z.append(f)
flattened = list(itertools.chain.from_iterable(z))
for ki in flattened[0:s]:
    print (ki+' ',end='')

2

Re: Задачки

Проблема коли ввожу велике число -> на виході

110
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 blast@dell:~$

3 Востаннє редагувалося ktretyak (22.11.2014 21:03:38)

Re: Задачки

Хоча код на Python не напишу, але здається це досить проста задача:
* перший цикл з лічильником, в якому з кожною ітерацією додається одиниця, і перевіряється маркер завершення циклу (від другого циклу)
** другий цикл, в тілі першого цикла, за кожною своєю ітерацією додає елементи в масив, перераховує їх та порівнює цю цифру з n; причому кількість ітерацій другого циклу дорівнює цифрі лічильника першого циклу, і цю ж цифру додає в масив в якості елемента; якщо в черговій ітерації кількість елементів зрівняється з n, то відмічається маркер завершення першого циклу та здійснюється "досрочное" завершення другого цикла.

4

Re: Задачки

ktretyak написав:

Хоча код на Python не напишу, але здається це досить проста задача:
* перший цикл з лічильником, в якому з кожною ітерацією додається одиниця, і перевіряється маркер завершення циклу (від другого циклу)
** другий цикл, в тілі першого цикла, за кожною своєю ітерацією додає елементи в масив, перераховує їх та порівнює цю цифру з n; причому всі елементи, які додаються в масив відображають стан лічильника першого (зовнішнього) циклу; якщо в черговій ітерації кількість елементів зрівняється з n, то відмічати маркер завершення першого циклу.

Або ви не зрозуміли завдання , або я не зрозумів вашого пояснення.
Пробую з 0 переробити.

5 Востаннє редагувалося ktretyak (22.11.2014 21:47:41)

Re: Задачки

Цікава задачка, можна її розв'язати ще простіше, ніж я вище написав (без масиву).

На PHP це має такий вигляд:

<?php

$n = 15;

for($marker = 0, $i2 = $i1 = 1; $marker == 0; $i1++)
{
  for($i3 = 1; $i1 >= $i3; $i2++, $i3++)
  {
    if($n < $i2)
    {
      $marker = 1;
      break;
    }
    
    echo "$i1 ";
  }
}

6

Re: Задачки

Не шарю в пайтоні, але в мене на Сі виглядає так:

#include <stdio.h>

int main()
{
  int n, count, max, b;
  printf("Кількість чисел: "); scanf("%d", &max);
  b = 1; count = 1;

  for(n=1; n<=max; n++) {
    for(count=1; count<=i; count++) {
      printf("%d ", n);
      if(b==max) goto trr;
      b++;
    }
  }

  trr: printf("\n");
  return 0;
}

7

Re: Задачки

Коли я бачу конструкцію goto, то зразу згадую за картинки на цю тему =)

8

Re: Задачки

ktretyak написав:

Коли я бачу конструкцію goto, то зразу згадую за картинки на цю тему =)

А мені щось типу цього:

1.Спочатку прочитай пункт 4
2. А ні для цього тобі потрібно  Н...
3.Хоча спочатку давай 2
4.Заглянь но до пунку 3

9

Re: Задачки

#!/usr/bin/env python3


n = int(input('Enter number: '))

result = []

for i in range(1, n):
    t = n - len(result)

    result += [i]*i if t >= i else [i]*t

for i in result:
    print(i, end=' ')

print()

10

Re: Задачки

ktretyak написав:

Коли я бачу конструкцію goto, то зразу згадую за картинки на цю тему =)

Тут якраз цілком законне його використання, не треба лякати людину динозаврами.

11

Re: Задачки

Чому б замість goto не використати звичайний break, який якраз призначається для виходу з цикла?

12

Re: Задачки

mahobo написав:

Не шарю в пайтоні, але в мене на Сі виглядає так:

#include <stdio.h>

int main()
{
  int n, count, max, b;
  printf("Кількість чисел: "); scanf("%d", &max);
  b = 1; count = 1;

  for(n=1; n<=max; n++) {
    for(count=1; count<=i; count++) {
      printf("%d ", n);
      if(b==max) goto trr;
      b++;
    }
  }

  trr: printf("\n");
  return 0;
}

gcc -Wall main.c -o main
main.c: In function ‘main’:
main.c:10:25: error: ‘i’ undeclared (first use in this function)
main.c:10:25: note: each undeclared identifier is reported only once for each function it appears in

13

Re: Задачки

ktretyak написав:

Чому б замість goto не використати звичайний break, який якраз призначається для виходу з цикла?

Тому що він викине лише з внутрішнього циклу.

14 Востаннє редагувалося ktretyak (24.11.2014 01:34:34)

Re: Задачки

quez написав:
ktretyak написав:

Чому б замість goto не використати звичайний break, який якраз призначається для виходу з цикла?

Тому що він викине лише з внутрішнього циклу.

Правильно, але це виявляє ще одну недоречність в наведеному коді

for(n=1; n<=max; n++) {

На скільки я розумію, то умова n<=max ніколи не буде виконаною. От замість неї доречніше підставити маркер, значення якого якраз і завершило зовнішній цикл.

UPD:
точніше умова n<=max завжди буде виконуватись, тобто при ній цикл ніколи не завершиться.

15

Re: Задачки

ktretyak написав:
quez написав:
ktretyak написав:

Чому б замість goto не використати звичайний break, який якраз призначається для виходу з цикла?

Тому що він викине лише з внутрішнього циклу.

Правильно, але це виявляє ще одну недоречність в наведеному коді

for(n=1; n<=max; n++) {

На скільки я розумію, то умова n<=max ніколи не буде виконаною. От замість неї доречніше підставити маркер, значення якого якраз і завершило зовнішній цикл.

UPD:
точніше умова n<=max завжди буде виконуватись

Ні, мітка там не допомогла б. Коли внутрішній цикл починає нову ітерацію, він не перевіряє, що там за умова в зовнішньому циклі. Тому в такому разі якби ви ввели 4, то отримали б 1 2 2 3 3 3.
Хоча код викликає підозри. Дивлячись на змінну i, виникає підозра, що його ніхто не запускав.

16

Re: Задачки

quez написав:

Ні, мітка там не допомогла б. Коли внутрішній цикл починає нову ітерацію, він не перевіряє, що там за умова в зовнішньому циклі. Тому в такому разі якби ви ввели 4, то отримали б 1 2 2 3 3 3.
Хоча код викликає підозри. Дивлячись на змінну i, виникає підозра, що його ніхто не запускав.

Цикл, який почався викликав внутрішній цикл, після завершення кого перевіряється умова "чи продовжувати цикл", так що допомогло б

17

Re: Задачки

ktretyak написав:
quez написав:

Ні, мітка там не допомогла б. Коли внутрішній цикл починає нову ітерацію, він не перевіряє, що там за умова в зовнішньому циклі. Тому в такому разі якби ви ввели 4, то отримали б 1 2 2 3 3 3.
Хоча код викликає підозри. Дивлячись на змінну i, виникає підозра, що його ніхто не запускав.

Цикл, який почався викликав внутрішній цикл, після завершення кого перевіряється умова "чи продовжувати цикл", так що допомогло б

Як сказав би Віталій Кличко, «цикл завершується тоді, коли він завершується» :D. Тобто (дивіться в мій приклад), коли внутрішній цикл від одного до трьох, то він спочатку виконається тричі, а потім буде щось провіряти.
Мітку можна вписати в умову внутрішнього циклу, там вона працюватиме.

18

Re: Задачки

quez написав:

...Тобто (дивіться в мій приклад), коли внутрішній цикл від одного до трьох, то він спочатку виконається тричі

Ви хочете сказати, що в C цикл for() не перевіряє умови за кожною ітерацією? Мабуть ні, а тому дивіться аналог робочого коду на PHP, кажуть C та PHPдуже схожі.

19

Re: Задачки

І нащо там той маркер?
http://ideone.com/61ai1y

20

Re: Задачки

Ви можливо не побачили напису Time limit exceeded    #stdin #stdout 5s 25752KB