А100

Задача: Пусть [latex] x_{1}=x_{2}=x_{3}=1 [/latex];

[latex] x_{i}=x_{i-1}+x_{i-3} [/latex];

[latex] i=4, 5, [/latex]…

Вычислить [latex] \sum_{i=1}^{100}{\frac{x_{i}}{2^{i}}} [/latex]

Тесты:

n result
-1 error
0 error
1 0.5
2 0.75
3 0.875
4 1
5 1,09375
12 1.305908
100 1.333333

Код программы:

Код программы на языке Java:

Ссылка: https://ideone.com/NVdBlc

План программы:

  1.  Назначение рабочих переменных
  2. Проверка ввода n
  3. Основной цикл сравнения для получения нужного значения переменных
  4. Цикл вычисления
  5. Вывод результата

Программа выполняет суммирование в цикле согласно заданной формуле. Задаётся только число итераций, а слоагемое вычисляется согласно формуле.

Ссылка на ideone.com: http://ideone.com/Yy8e5l

12 thoughts on “А100

  1. Для начала неплохо. Ошибки писать не буду. Сначала сделайте тесты для разных n. Сначала небольших. Чтобы можно было вычислить вручную. Например, если n взять не 100, а скажем 4, то программа должна выдать 1/2 + 1/4 + 1/8 + 2/16 = 16/16 = 1. А для n=5 добавится ещё 3/32 и ответом будет… сами сосчитайте.
    Кстати, в числителе известная последовательность коров Нараяны

  2. Теперь можно проверять:
    — Меток нет.
    — Вложенные циклы здесь точно ненужны. Из Вашего пояснения я даже предположить не могу, в чём состоит идея алгоритма.
    — Вместо тестов сплошная халтура. Ну как у Вас получается 0.25 для n=1? В условии написано х1=1. Разделили на 2 получили 0.5. СЧИТАЙТЕ ТЕСТЫ НА БУМАГЕ ИЛИ В УМЕ!

    По программе. Алгоритм у Вас очень простой. Есть 4 переменные. Три из них равны 1. Четвёртая вычисляется как сумма первой и третьей. После этого все значения сдвигаем и снова считаем сумму. Это числитель.
    Знаменатель вначале равен 2. Потом удваивается на каждом шаге.
    Остаётся накапливать в сумматоре частное от деления числителя на знаменатель.

    Если с вычислением числителя не всё понятно, то стоит посмотреть идею «элегантного решения» вычисления чисел Фибоначчи. Там всё как у Вас только используются два предыдущих числа, а у Вас их три.

  3. Совсем мелкое замечание.
    А100 — это задача №100 в задачнике Абрамова. Т.е. буква А кириллическая (русская или украинская раскладка). Вы набираете латинскую A. На вид неотличимо, но поисковик не находит Вашего решения.
    Лучше набирать А100 не в английской раскладке, а в русской или украинской. Тогда читателям легче будет находить Вашу работу.

  4. Извините за халтуру, не успевал проверить.
    Проблема была в баге в цикле расчёта степени 2. Исправил.
    Вместо вложенного цикла использовал pow.

  5. Максим, у Вас не возникло желания упростить код, глядя на него «с высоты прожитых лет»? Ведь задача решается всего в несколько строк.

    — У Java варианта серьёзные проблемы с анализом вводимых данных. У вас две проверки подряд на n <= 0 с разными действиями и return после первого. - Если решили сообщать об ошибках, то для этого следует использовать cerr (C++) и Sisten.err (Java).

    • Спасибо за замечание, проверка была на n была действительно лишняя, на самом деле я хотел проверить на отсутствие ввода n отдельно от его значения. Теперь я исправил, однако для выявления случая когда n не введен вообще ( ScanInt возвращает null ) мне пришлось изменить тип на Integer, затем я объединил проверку на не введенное и неправильное n и вывожу сообщение об ошибке через System.err . Замечу, что в консоли Windows сообщение об ошибке выводится, а в Ideone — нет. Очевидно, Ideone не способен читать то, что выводится в поток ошибок. Собственно, я изначально выводил сообщения об ошибках также в StdOut из-за этого св-ва Ideone .

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