A166

Задача: 

Дано натуральное число [latex]n[/latex], действительные числа  [latex]{a}_{1},…,{a}_{n}[/latex] . Получить числа[latex]{b}_{1},…,{b}_{n}[/latex], которые связаны с [latex]{a}_{1},…,{a}_{n}[/latex]  следующим образом:

[latex]{ b }_{ 1 }={ a }_{ 1 },{ \quad b }_{ n }={ a }_{ n },\quad { b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 } ,\quad i=2,…,n-1[/latex]

Тесты:                               (числа разделяются «|» для удобного чтения)

Ввод Вывод Комментарий:
3 | 3 | 3 | 3 3 | 0 | 3 Работает.
4 | 3.14 | -2.71 | 42 | 10 3.14 | 14.9033 | -10.6667 | 10 Работает.
1 | 2 | 3 | 4 | 5 2 Работает.
5 | 4 | -3 | 2 | -1 | 0 4 | 1.66667 | -1 | 0.333333 | 0 Работает.

Объяснение переменных:

[latex]n[/latex] — это  [latex]n[/latex]  из условия.

[latex]a1, a2[/latex] — динамические числа, которые меняются с каждым шагом цикла.  [latex]a1[/latex]  — вводится с клавиатуры.  [latex]a2[/latex] — дублируется с [latex]a1[/latex]  посредством шага цикла. Нужны для выполнения условия [latex]{ b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 }[/latex]

 

Код:   Проверить на ideone.

Алгоритм выполнения объясняется в комментариях в коде

 

Особенности:

  1. Переменные:
    • int  n<code>;.  <code>int<code> , ибо так требует негласное условие задачи.
    • double a1, a2<code>;.   <code>double<code>  так как в задаче не обговаривалось на каком числовом поле её следует выполнять, то я предпочёл [latex]a1,a2 \in \Re [/latex] .
  2. Цикл for<code> (укажу особенности):
      • (i++, a2 = a1)<code>   - шаг цикла (модификация). Увеличение счётчика на единицу, присвоение [latex]a2[/latex] значение [latex]a1[/latex]

    Сложность этой задачи сводится к понимаю a2 = a1<code>. Цикл выполнит шаг тогда, когда он выполнил задачу своего "тела". Так как на следущее выполнение "тела" [latex]a2[/latex] "не успеет" обновится, то [latex]a2[/latex] становится "предыдущим" элементом

Итог работы:

Код обрабатывает поток данных [latex]n[/latex] раз. Это значит, что лишние числа будут игнорироваться.

Божик Семен
Божик Семен

Latest posts by Божик Семен (see all)

15 thoughts on “A166

    • Как мне понимать «Каких-то чисел»? Я их ввожу (тогда код работает)?, или мне сделать ограничение на цикл (например, который из 8 цифр, работает только с 5, если 5 первое число? И не работает, если цифр меньше, чем первое число)? Или может все последующие цифры, после первого вводимого, будут задаваться рандомом?

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

  1. «Во входном потоке находится число n за которым следуют n каких-то чисел.» Игорь Евгеньевич указывает Вам, что во входном потоке вначале находится количество чисел последовательности, сами числа следуют потом.
    Т.е., например, для первого теста вход такой:
    5
    1 3 3 3
    или, например,
    3
    -5 6 6
    а не просто 1 3 3 3 или -5 6 6, как у Вас. Так задано по условию задачи, конечно хорошо, что Вы умеете правильно считывать числа до конца входного файла, но в именно этой задаче этого не требуется. Исправьте этот технический момент.

    Хуже, что Ваша программа работает неправильно и якобы проходит тесты. Как Вы получили строчку
    1 2 3 4 5 1 -0.333333 -0.333333 -0.333333 5 Работает
    по Вашей формуле Вы от следующего члена последовательности отнимаете какой-то текущий, т.е. для строго возрастающей последовательности положительных чисел в ответе будут только положительные значения.

    Объясните, пожалуйста, зачем Вам нужен второй (вложенный) цикл, не могу понять. Я понимаю условия if(i == 0) и if(i >= 1) хоть Вы их и описали в отчете очень кратко (ну это ладно) — формула первого и последующих элементов отличаются. Можно ли обойтись без этих условий? Наверное, можно, обработав первый элемент последовательности до цикла. Но и Ваш вариант имеет право на жизнь. Но необходимость вложенного цикла я не понимаю, значит вряд ли кто-то еще поймет — нужно либо исключить его либо описать в отчете зачем он нужен, раз это не очевидно.

    Кроме того я не понял зачем Вы поставили большой промежуток (\quad) в формуле для b_i. Такой большой промежуток выглядит нелепо.

  2. — «первая цифра должна обозначать количество цифр» — поищите что такое цифра и справьте тест
    — Попытался перечислить замечания по дальнейшему тексту отчёта. Их слишком много. Просто почитайте текст, там часто встречаются несогласованные словосочетания. Нужно поправить.
    -Про какие вложенные циклы Вы пишите в тексте программы.
    — Поставьте правильные отступы в программе
    — Пожалуйста, продумайте программу. Сейчас там какая-то каша. вместо простого алгоритма.
    — Имена переменных следует выбирать по их назначению. Например firstNumb показывает, что её значение было первым числом в списке данных. Это неудачное имя. Назначение переменной — хранить количество чисел последовательности. В условии это n. Чем было плохое имя? Остальные имена не лучше.

    Семён. Сейчас это решение может быть зачтено примерно на 2-3 балла по нашей шкале. Может хватит дурачиться?

  3. Видимо это какой-то тест на терпение? Уверен, что его пройду 🙂
    — Исправьте 3-й тест. Там в ответе должно быть 5 чисел, а не одно.
    — Исправьте все тесты. Первым числом всегда вводится количество чисел.
    — Если во входном потоке записано такое:
    4
    1 4 10 19
    то в выходной поток программа должна записать
    1 2 3 19

    • Но ведь Александр Сергеевич написал:
      «Т.е., например, для первого теста вход такой:
      5
      1 3 3 3».

      Т.к. я неправильно понял условие, то после этого в мою голову окончательно было вбито, что первое число должно входить в ответ. Извините.

      Почему третий тест должен выдавать 5 чисел в ответе, если первое число 1? Должно выводится 1 число. Разве нет?

      Исправил код и подправил отчёт, теперь всё как надо, надеюсь.

  4. — Возможно Александр Сергеевич просто допустил опечатку. Строчкой ниже у него есть ещё один пример и там всё хорошо.
    — Количество чисел Вы в тестах не выделяли в отдельную строку. В программе количество членов последовательности вообще не читалось.
    — Оказывается 1 | 2 | 3 | 4 | 5 это последовательность из одного числа 2, а остальные не должны читаться? Тогда желательно написать об этом тесте пару слов в отчёте, чтобы объяснить, что Вы проверяете избыточные данные во входном потоке.
    — Очень не желательно сочетать в одной программе cin и scanf. Это функции из разных библиотек и в некоторых случаях могут быть не синхронизированы. Используйте какой-либо один подход.

    — В условии указаны формулы для первого числа, последнего числа и чисел между ними (с номерами 2, … n-1). Значит всего должно быть n не менее 3. При таком понимании программа могла бы выглядеть так (в Вашей стилистике):

    Зачтено, но исправьте, пожалуйста, замечания выделенные жирным шрифтом.

    • Да, прошу прощения за свою опечатку! Недоглядел! Она сбила Семена с толку, к сожалению.
      По программе и отчету полностью согласен с замечаниями Игоря Евгеньевича! Еще небольшое замечание: программный код не нужно набирать как latex-формулы, можно использовать тег code в угловых скобках (в режиме редактирования разметки) или Форматы->Строки->Код (то же самое, но в визуальном редакторе). Еще лучше использовать Crayon — но для маленьких кусков вполне уместен тег code . Когда мы пишем некоторую величину в отчете, то она выходит как математическая формула — но C++ код в математические формулах смотрится нелепо.

      Семен, у Вас очень оригинальный стиль программирования и стиль написания отчета — но не всегда это уместно. Возьмем фрагмент:
      «a1, a2 – динамические числа, которые меняются с каждым шагом цикла. a1 – вводится с клавиатуры. a2 – дублируется с a1 посредством шага цикла. Нужны для выполнения условия { b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 }»
      динамические числа … дублируется с a1 … Нужны для выполнения условия … так не говорят. можно, например, так (минимальные изменения): «a1, a2 – переменные, которые меняются с каждым шагом цикла. a1 – текущий элемент последовательности, вводится с клавиатуры. a2 – предыдущий элемент последовательности, в него дублируется элемент a1 посредством итератора/шага цикла. Нужны для вычисления элементов { b }_{ i }=\frac { { a }_{ i+1 }\quad -\quad { a }_{ i } }{ 3 }» посмотрите — здесь дополнительно указано, что такое a1, a2, заменено неуместное «дублируется с» , третье выражение в цикле называется итератором цикла (см. и см.), в некоторых других источниках называется шагом цикла, а в некоторых одним словом не называется вообще.
      Старайтесь писать проще и четче.

Добавить комментарий