§ 6. Использование основных алгоритмических конструкций для решения задач

6.4. Нахождение суммы элементов числовой последовательности

Пример 6.15. В секретной лаборатории выводят полезные бактерии. Экспериментально было установлено, что количество бактерий (в млн) завит от номера дня, в который проводится эксперимент, следующим образом: begin mathsize 16px style a subscript n space equals fraction numerator n cubed over denominator square root of n cubed space minus space n space plus space 1 end root end fraction end style. Определите, сколько бактерий вывели за m дней.

Этапы выполнения задания.

 IИсходные данные: m (число дней).

II. Результат: s (общее количество бактерий).

III. Алгоритм решения задачи.

1. Ввод числа m
2. Для вычисления общего количества бактерий необходимо последовательно прибавлять количество бактерий, выведенных в текущий день, к уже полученному количеству бактерий. Начальное значение суммы равно 0. 
3. Так как количество дней заранее известно, для вычисления суммы можно воспользоваться циклом for
4. Количество бактерий в текущий день будем хранить в переменной а. Значение a зависит от значения n — счетчика дней. Переменная n изменяется от 1 до m
5. Вывод результата s.

IV. Описание переменных: m – int, s, a – double.

Пример 6.16. Написать программу для вычисления суммы, имеющей своими слагаемыми элементы последовательности begin mathsize 16px style a subscript n space equals space fraction numerator n space plus space 2 to the power of n over denominator n factorial end fraction end style. Вычисления производить до тех пор, пока не найдется слагаемое, для которого верно неравенство begin mathsize 16px style open vertical bar a subscript n close vertical bar space less than space e p s end style. Значение eps вводится (begin mathsize 16px style 0 space less than space e p s space less than space 1 end style).

Этапы выполнения задания

I. Исходные данные: eps (точность вычислений).

II. Результат: переменная s (сумма).

III. Алгоритм решения задачи.

1. Ввод числа eps. 
2. Для вычисления суммы необходимо последовательно прибавлять очередное слагаемое, удовлетворяющее условию задачи, к уже полученной сумме.

2.1. Так как количество слагаемых заранее не известно, то для вычисления суммы воспользуемся циклом do…while
2.2. Начальное значение суммы s = 0.
2.3. Текущее значение слагаемого будем хранить в переменной а. Значение a зависит от значения n — счетчика слагаемых в сумме. Переменная n будет изменяться на 1 до тех пор, пока выполняется условие задачи. Начальное значение n = 0.
2.4. Отдельно нужно получать 2n и n! Для этого заведем переменные d (для хранения значения 2n) и f (для хранения значения n!). Начальные значения переменных: d = 1, f = 1. Для каждого следующего слагаемого предыдущее значение переменной d увеличивается в два раза, значение переменной f увеличивается в n раз.

3. Вывод результата s.

IV. Описание переменных: n – int, eps, a, s, d, f – double.

Пример 6.15.

V. Программа:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  int m;

  cout << "m = ";

  cin >> m;

  double s = 0;

  for (int n = 1; n <= m; n++){

    double x = 1. * n * n * n;

    double a = x / (sqrt(x)- n + 1);

    s += a;

  }

  cout << "s = " << s << endl;

  return 0;

}

VI. Тестирование

VII. Анализ результата. Для проверки правильности результата можно посчитать значение суммы на калькуляторе:

begin mathsize 14px style a subscript italic 1 space equals space 1 semicolon end style

begin mathsize 14px style a subscript 2 space equals space fraction numerator 2 cubed over denominator square root of 8 space minus space 2 space plus space 1 end fraction almost equal to 4.38 semicolon end style

begin mathsize 14px style a subscript 3 space equals space fraction numerator 3 cubed over denominator square root of 27 space minus space 3 space plus space 1 end fraction almost equal to space 8.44 comma end style

begin mathsize 14px style S space almost equal to space 13.82. end style

Пример 6.16.

V. Программа:

#include <iostream>

#include <cmath>

 

using namespace std;

 

int main()

{

  double eps, a;

  cout << "eps = ";

  cin >> eps;

  int n = 0;

  double s = 0;

  double d = 1;

  double f = 1;

  do  {

    n++;

    ///вычисление факториала

    f *= n;

    ///возведение 2 в степень

    d *= 2;

    a =(+ d) / f;

    s += a;

  }

  while (abs(a) >= eps);

  cout << "summa= " << s << endl;

  return 0;

}

VI. Тестирование

VII. Анализ результата. Поскольку факториал является чрезвычайно быстро растущей функцией, то элементы последовательности убывают.  Выпишем элементы:

begin mathsize 14px style a subscript 1 space equals space fraction numerator 1 space plus space 2 over denominator 1 end fraction space equals space 3 semicolon space space space space space a subscript 2 space equals space fraction numerator 2 space plus space 2 cubed over denominator 2 factorial end fraction space equals space 3 semicolon
a subscript 3 space equals space fraction numerator 3 space plus space 2 cubed over denominator 3 factorial end fraction space equals 11 over 6 space almost equal to space 1 comma 83 semicolon
a subscript 4 space equals space fraction numerator 4 space plus space 2 to the power of 4 over denominator 4 factorial end fraction space equals 20 over 24 space almost equal to space 0 comma 83 semicolon
a subscript 5 space equals space fraction numerator 5 space plus space 2 to the power of 5 over denominator 5 factorial end fraction space equals 37 over 120 space almost equal to space 0 comma 31 semicolon
a subscript 6 space equals space fraction numerator 6 space plus space 2 to the power of 6 over denominator 6 factorial end fraction space equals 70 over 720 space almost equal to space 0 comma 097. end style

Шестой элемент меньше 0.1. Это последнее слагаемое в сумме. Сумма первых шести элементов — ≈9.07.

Если eps = 0.01, то к сумме, полученной для eps = 0.1, будут добавляться слагаемые, которые меньше 0.1, которые незначительно изменят значение суммы.

.

Разница в значениях суммы  ≈0.03. Чем меньше точность, тем меньше будут отличаться суммы.