Пятница, 26.04.2024, 05:19 | RSS | Приветствую Вас Гость
Главная | Регистрация | Вход
Меню сайта
Категории раздела
Разное [10]
Решения задач (студентам) [9]
PC Игры - кодинг [2]
Python [1]
PHP, Mysql [1]
HTML, CSS, Javascript [1]
Scilab [1]
Поиск
Опрос
Какой язык программирования Вы предпочитаете?
Всего ответов: 44
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Решения задач (студентам)

Задача на циклы. Вычисление многоэтажной дроби.
Имеется многоэтажная (несколько десятков "этажей") дробь. Требуется ее вычислить.



Нельзя не заметить, что эта дробь содержит около 50-и "этажей". Но у нее есть повторяющиеся элементы, а именно знаменатели. Главное в данном случае применить правильную формулу. В первую очередь числа слева от плюсов это идущие подряд нечетные числа. Их можно представить в виде 2*i+1 (но в эту последовательность не войдет ноль, это надо учесть!). Так же можно заметить, что каждый очередной знаменатель это дробь сумма из такого нечетного числа и еще одной такой же дроби и так до конца. А в конце стоит уже не дробь, а конкретное число. А именно следующее за последним слагаемым нечетное число.

Если бы эта дробь не была такой большой и ее можно было решить в ручную, то это следовало бы делать начиная с самой нижней дроби. Именно этим способом и следует решать всю эту громадину, используя цикл. Для этого понадобится такая формула: res= i+(1/res). Эта формула как раз повторяет структуру дроби. Так как нам известно число, стоящее в самом нижнем знаменателе изначально присваиваем это число к res. И далее прокручиваем эту формулу в цикле, проходя по дроби снизу вверх.

Чтобы не мелочиться, тем более, что это ни к чему, напишем функцию, вычисляющую дробь с такой же закономерностью любого размера (с любым количеством этажей).

Код функции.

float oper(int n)
{
  int i=n-2;
  float res;
  res= n;
  while (i>0)
  {
    res= i+(1/res);
    i= i-2;
  }
  res= 1/res;
  return(res);
}

Обратите внимание на строку res= 1/res. В цикле вычисляется значение всей части ниже самой верхней единицы. Но так как 0 не вписывается в последовательность нечетных чисел, приходится производить деление оставшейся единицы отдельно, хотя и самый верхний уровень дроби тоже вписывается в выше описанную формулу (но при этом i =0). В качестве фактического параметра в данную функцию передается число, находящееся в самом нижнем знаменателе (в нашем случае 103).

Далее в теле программы применяем нашу функцию для вычисления данной дроби.

printf("%f", oper(103));

P.S. Если у кого есть идея, как организовать это решение с помощью рекурсии - жду...

Поделиться ссылкой в соц. сетях:

Категория: Решения задач (студентам) | Добавил: =Sanek= (21.05.2011)
Просмотров: 4690 | Теги: программирование c/c++, решение задач, программирование, студентам | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

© 2024 raznocoding.do.am