ВВЕРХ
ВНИЗ

Функции с использованием факториала

For19. Дано целое число N (> 0). Найти произведение

N! = 1·2·…·N

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
var
  i, N: integer;
  factorial: real;

begin
  write('N = ');
  readln(N);
  { Начальное значение факториала (0! = 1): }
  factorial := 1;
  { Чтобы вычислить i!, надо предыдущее значение 
  умножить на i, для всех i от 1 до N: }
  for i := 1 to N do
    factorial := factorial * i;
  writeln;
  writeln(' ', N, '! = ',  factorial);
  readln
end.

For20. Дано целое число N (> 0). Используя один цикл, найти сумму

1! + 2! + 3! + … + N!

(выражение N! — N–факториал — обозначает произведение всех целых чисел от 1 до N: N! = 1·2·…·N). Чтобы избежать целочисленного переполнения, проводить вычисления с помощью вещественных переменных и вывести результат как вещественное число.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
var
  i, N: integer;
  factorial, S: real;

begin
  write('N = ');
  readln(N);
  factorial := 1; { <== Начальное значение факториала (0! = 1) }
  S := 0; { <== Начальное значение суммы факториалов }
  { Чтобы вычислить сумму факториалов 1! + ... + i!, надо к сумме
  1! + ... + (i - 1)! добавить i!, и всё это для i от 2 до N: }
  for i := 1 to N do
  begin
    factorial := factorial * i; { <== Находим i! }
    S := S + factorial { <== Сумму увеличиваем на i! }
  end;
  writeln;
  writeln(' 1! + ... + ', N, '! = ', S);
  readln
end.

Разложение некоторых функций в ряд

For21. Дано целое число N (> 0). Используя один цикл, найти сумму

1 + 1/(1!) + 1/(2!) + 1/(3!) + … + 1/(N!)

(выражение N! — N–факториал — обозначает произведение всех целых чисел от 1 до N: N! = 1·2·…·N). Полученное число является приближенным значением константы e = exp(1).

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
var
  i, fact, N: integer;
  Sum: real;

begin
  write('N = ');
  readln(N);
  Sum := 1; { <== начальная сумма равна 1 }
  fact := 1; { 0! = 1 }
  for i := 1 to N do
  begin
    fact := fact * i; { <== находим i! }
    Sum := Sum + 1 / fact { находим сумму }
  end;
  writeln;
  writeln('Значение суммы: ', Sum);
  readln
end.

For22. Дано вещественное число X и целое число N (> 0). Найти значение выражения

1 + X + X2/(2!) + … + XN/(N!)

(N! = 1·2·…·N). Полученное число является приближенным значением функции exp в точке X.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  i, N: integer;
  Sum, a, x: real;

begin
  write('x = ');
  readln(x); { <-- Вводим вещественное x }
  Sum := 1; { <== Начальная сумма }
  { Далее выполнять программу имеет 
  смысл только в случае x ≠ 0: }
  if x <> 0 then
  begin
    write('N = ');
    readln(N); { <-- Вводим целое количество N }
    a := 1; { <== Первое слагаемое }
    for i := 1 to N do
    begin
      { Предыдущее значение слагаемого умножаем на x, а потом 
      делим на i. В результате мы получим последовательность 
      значений для 1-го, 2-го, ..., N-го членов:
            x,  x^2/2!,  x^3/3!,  ...,  x^N/N! }
      a := a * x / i;
      Sum := Sum + a { <== Находим сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', Sum);
  readln
end.

For23. Дано вещественное число X и целое число N (> 0). Найти значение выражения

X − X3/(3!) + X5/(5!) − … + (−1)N-1·X2·N-1/((2·N-1)!)

(N! = 1·2·…·N). Полученное число является приближенным значением функции sin в точке X.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  i, N: integer;
  Sum, a, x, y: real;

begin
  write('x = ');
  readln(x);
  Sum := x; { <== Начальная сумма равна первому члену x }
  { Далее выполнять программу имеет смысл только при x ≠ 0 
  (в противном случае все слагаемые равны 0): }
  if x <> 0 then
  begin
    write('N = ');
    readln(N);
    a := x; { <== Первое слагаемое в данной сумме }
    y := sqr(x); { <== Запоминаем x в квадрате }
    for i := 1 to N - 1 do
    begin
      { Для вычисления i-го значения предыдущее значение (с 
      противоположным знаком) умножаем на x в квадрате (число y) и
      делим на произведение последовательных натуральных чисел: }
      a := -a * y / (2 * i * (2 * i + 1));
      Sum := Sum + a { <== Находим сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', Sum:0:5);
  readln
end.

For24. Дано вещественное число X и целое число N (> 0). Найти значение выражения

1 − X2/(2!) + X4/(4!) − … + (−1)N-1·X2·N-2/((2·N-2)!)

(N! = 1·2·…·N). Полученное число является приближенным значением функции cos в точке X.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  i, N: integer;
  Sum, a, x, y: real;

begin
  write('x = ');
  readln(x);
  Sum := 1; { <== Начальное значение суммы }
  { Дальнейшие вычисления производим при x ≠ 0, так как в противном
  случае искомая сумма равна 1 (все слагаемые равны 0): }
  if x <> 0 then
  begin
    write('N = ');
    readln(N);
    y := sqr(x); { <== Вычисляем x в квадрате }
    a := 1; { <== первое слагаемое в данной сумме }
    for i := 1 to N - 1 do
    begin
     { Для вычисления i-го значения предыдущее значение (с 
     противоположным знаком) умножаем на x в квадрате (число y) и
     делим на произведение последовательных натуральных чисел: }
      a := -a * y / ((2 * i - 1) * 2 * i);
      Sum := Sum + a { <== Увеличиваем сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', Sum:0:5);
  readln
end.

For25. Дано вещественное число X (|X| ≤ 1) и целое число N (> 0). Найти значение выражения

X − X2/2 + X3/3 − … + (−1)N−1·XN/N.

Полученное число является приближенным значением функции ln в точке 1 + X.

Условия задачи предполагают ввода значения X, которое по модулю не больше 1, поскольку именно для таких X указанный выше ряд (сумма) сходящийся. Это означает, что при |X| > 1 с увеличением N сумма будет стремится к бесконечности. Например, для X = 0.5 и X = 1 ряд сходящийся (сумма конечна), а для X = 1.1 − бесконечна.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
var
  i, N: word;
  Sum, a, x: real;

begin
  write('x = ');
  readln(x);
  Sum := x; { <== Начальная сумма равна первому члену x }
  { Далее выполнять программу имеет смысл только при x ≠ 0 
  (в противном случае все слагаемые равны 0): }
  if x <> 0 then
  begin
    write('N = ');
    readln(N);
    a := x; { <== Первое слагаемое }
    for i := 2 to N do
    begin
     { Предыдущее значение (с противоположным знаком) 
     умножаем на x: }
      a := -a * x;
      Sum := Sum + a / i { <== Находим сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', Sum:0:5);
  readln
end.

For26. Дано вещественное число X (|X| ≤ 1) и целое число N (> 0). Найти значение выражения

X − X3/3 + X5/5 − … + (−1)N-1·X2·N-1/(2·N-1).

Полученное число является приближенным значением функции arctg в точке X.

Здесь актуально то же замечание относительно X, что и в задании For25 (см. выше).

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  i, N: integer;
  S, a, x, y: real;

begin
  write('x = ');
  readln(x);
  S := x; { <== Начальная сумма равна первому члену x }
  { Далее выполнять программу имеет смысл только при x ≠ 0 
  (в противном случае все слагаемые равны 0): }
  if x <> 0 then
  begin
    write('N = ');
    readln(N);
    a := x; { <== Первое слагаемое в данной сумме }
    y := sqr(x); { <== Запоминаем x в квадрате }
    for i := 2 to N do
    begin
     { Для вычисления i-го значения предыдущее значение (с 
     противоположным знаком) умножаем на x в квадрате (число y) и
     делим на произведение последовательных натуральных чисел: }
      a := -a * y;
      S := S + a / (2 * i - 1) { <== Находим сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', S:0:5);
  readln
end.

For27. Дано вещественное число X (|X| ≤ 1) и целое число N (> 0). Найти значение выражения

X + 1·X3/(2·3) + 1·3·X5/(2·4·5) + …+ 1·3·…·(2·N−3)·X2·N-1/(2·4·…·(2·N-2)·(2·N-1)).

Полученное число является приближенным значением функции arcsin в точке X.

Здесь актуально то же замечание относительно X, что и в задании For25 (см. выше).

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
var
  i, N: integer;
  S, a, x, y: real;

begin
  write('x = ');
  readln(x);
  S := x; { <== начальная сумма равна первому члену x }
  { Далее выполнять программу имеет смысл только при x ≠ 0 
  (в противном случае все слагаемые равны 0): }
  if x <> 0 then
  begin
    write('N = ');
    readln(N);
    y := sqr(x); { <== Вычисляем x в квадрате }
    a := x; { <== первое слагаемое в данной сумме }
    for i := 2 to N do
    begin
     { Для вычисления i-го значения предыдущее значение 
     умножаем на x в квадрате (число y), умножаем на 
     нечетное (2i-3) и делим на четное (2i-2): }
      a := a * y * (2 * i - 3) / (2 * i - 2);
      S := S + a / (2 * i - 1) { <== находим сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', S:0:5);
  readln
end.

For28. Дано вещественное число X (|X| ≤ 1) и целое число N (> 0). Найти значение выражения

1 + X/2 − 1·X2/(2·4) + 1·3·X3/(2·4·6) − … + (−1)N−1·1·3·…·(2·N−3)·XN/(2·4·…·(2·N)).

Полученное число является приближенным значением функции (1+X)1/2.

Здесь актуально то же замечание относительно X, что и в задании For25 (см. выше).

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
var
  i, N: integer;
  Sum, a, x: real;

begin
  write('x = ');
  readln(x);
  Sum := 1; { <== Начальная сумма равна первому члену 1 }
  { Далее выполнять программу имеет смысл только при x ≠ 0 
  (в противном случае все последующие слагаемые равны 0): }
  if x <> 0 then
  begin
    write('N = ');
    readln(N);
    a := 1; { <== Первое слагаемое }
    for i := 1 to N do
    begin
     { Для вычисления i-го значения предыдущее значение 
     (с противоположным знаком) умножаем на x, умножаем на 
     нечетное (2i-3) и делим на четное (2i): }
      a := -a * x * (2 * i - 3) / (2 * i);
      Sum := Sum + a { <== Находим сумму }
    end
  end;
  writeln;
  writeln('Значение суммы: ', Sum:0:5);
  readln
end.

Яндекс.Метрика