Задача 1. Вычисление факториала числа. — КиберПедия 

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Задача 1. Вычисление факториала числа.

2020-12-06 128
Задача 1. Вычисление факториала числа. 0.00 из 5.00 0 оценок
Заказать работу

Решение

Program Problem1;

uses WinCrt;

var

   n: integer;

   f: real;

{---------------------------------------------------------------------------------------}

Procedure fac(n: integer; var f: real);

   begin

        if (n=0) or (n=1) then f:= 1

                                  else

                                     begin

                                         fac(n - 1, f);

                                         f:= f*n

                                     end

   end;

{---------------------------------------------------------------------------------------}

begin

  write('Введите натуральное значение n '); readln(n);

  fac(n, f);

  writeln('Факториал числа ', n, ' равен ', f:12:0)

end.

 

Задача 2. Над цепью озер летела стая белых гусей. На каждом озере садилось половина гусей и еще полгуся, а остальные летели дальше. Все гуси сели на семи озерах. Сколько гусей было в стае?

Решение

Математически задача решается устно очень остроумным способом.

Пусть вместе со стаей белых гусей все время летит еще один, Серый гусь. Если к некоторому озеру подлетит m белых гусей и Серый, то на этом озере садится  - ровно половина всех гусей вместе с серым. Поэтому после каждого озера число летящих гусей уменьшается ровно вдвое. После семи озер оно уменьшится в 27 = 128 раз, а остается летящим один Серый гусь. Значит, вначале было 128 гусей, из них 127 - белых.

А теперь выполним, образно говоря, прямые рассуждения для решения задачи.

Обозначим через xk количество летящих белых гусей, когда впереди еще k озер. Тогда условие задачи записывается так:

Отсюда получаем для последовательности (xk) рекуррентное соотношение

 

Program Problem 2;

uses WinCrt;

var

   k: integer;

{----------------------------------------------------------------------------------------}

Procedure goose(x, k: integer);

   begin

      if k = 1 then write(x) else goose(2*x + 1, k - 1)

   end;

{----------------------------------------------------------------------------------------}

begin

  write(' Введите число озер '); readln(k);

  write('В стае было ');

  goose(1, k);

  writeln(' гусей ')

end.

 

Задача 3. Мой богатый дядюшка подарил мне один доллар в мой первый день рождения. В каждый следующий день рождения он удваивал свой подарок и прибавлял к нему столько долларов, сколько лет мне исполнилось. Написать программу, подсчитывающую общую сумму денег, подаренных к N-му дню рождения и указывающую, к какому дню рождения сумма подарка превысит 100$.

Решение

Введем обозначения: k - число лет племянника, p - количество денег, которые дает дядя на каждом дне рождения, s - общая сумма денег, полученных племянником за все годы, n - счетчик числа дней рождения, который считает в обратном порядке от n (введенного пользователем) до 1.

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

Увеличивается число лет: k:= k + 1; вычисляется подарок к k -тому дню рождения: p:= 2*p + k; вызывается процедура, в которой увеличивается на p общая сумма полученных денег s и уменьшается на 1 число дней рождения:

uncle(k, p, s + p, n - 1)

Далее весь процесс повторяется, до тех пор, пока n не станет равным 1.

 

Program Rich _ man1; { richman - богатый }

uses WinCrt;

var

   n: integer;

{---------------------------------------------------------------------------------------}

Procedure uncle(k, p, s, n: longint); {uncle - дядя }

    begin

      if n = 1 then write(s)

                else

                   begin

                      k:= k + 1;

                      p:= 2*p + k;

                      uncle(k, p, s + p, n - 1)

                  end

   end;

{---------------------------------------------------------------------------------------}

begin

  write(' Введите число лет племянника '); readln(n);

  write('Я получу к ', n, '-ому дню рождения ');

  uncle(1, 1, 1, n);

  writeln(' долларов ')

end.

 

Во второй части условия требуется определить число лет, когда сумма полученных денег будет равна или превысит 100 долларов. Для этого в процедуре меняется опорное условие: if s >= 100 then write(n), а все остальное остается без изменений.

 

Program Rich _ man2;

uses WinCrt;

var

   n: integer;

{----------------------------------------------------------------------------------------}

Procedure uncle1(k, p, s, n: longint);

   begin

      if s >= 100 then write(n)

                         else

                           begin

                              k:= k + 1;

                              p:= 2*p + k;

                              uncle1(k, p, s + p, n + 1)

                           end

   end;

{--------------------------------------------------------------------------------------}

begin

  write('Сумма подарка превысит 100 долларов к ');

  uncle1(1, 1, 1, 1);

  writeln(' -ому дню рождения')

end.

 

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


Поделиться с друзьями:

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.016 с.