А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

Швандт Максим Альбертович
Швандт Максим Альбертович

Latest posts by Швандт Максим Альбертович (see all)

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 .

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