Вопрос задан 26.03.2025 в 08:24. Предмет Информатика. Спрашивает Пилипчук Оля.

По данному натуральному числу N найдите сумму чисел 1+1/1!+1/2!+1/3!+...+1/N!. Количество действий должно быть пропорционально N.

Входные данные
Задано единственное число N

Выходные данные
Необходимо вывести результат вычисления в виде действительного числа c точностью до 5 знаков после запятой.

Примеры
входные данные
1
выходные данные
2
c++

Перейти к ответам

Ответы на вопрос

Отвечает Сафронов Данил.

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

S=1+11!+12!+13!++1N!S = 1 + \frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + \dots + \frac{1}{N!}

где NN — это заданное натуральное число. При этом факториал k!k! для каждого числа kk рассчитывается как произведение всех целых чисел от 1 до kk.

Подход к решению:

  1. Факториал. Чтобы вычислить факториал числа kk, нужно последовательно перемножать все числа от 1 до kk. Например:

    • 3!=3×2×1=63! = 3 \times 2 \times 1 = 6
    • 4!=4×3×2×1=244! = 4 \times 3 \times 2 \times 1 = 24
  2. Сумма. Нам нужно вычислить сумму:

SN=1+11!+12!++1N!S_N = 1 + \frac{1}{1!} + \frac{1}{2!} + \dots + \frac{1}{N!}
  1. Пропорциональность действиям NN. Чтобы количество действий было пропорционально NN, можно избегать повторных вычислений факториалов. Например, можно считать факториал для каждого числа, начиная с 1!1!, используя предыдущее значение. То есть для каждого kk из суммы факториал k!k! можно вычислить как k!=k×(k1)!k! = k \times (k-1)!.

Алгоритм:

  1. Начать с суммы S=1S = 1 (первый член суммы).
  2. Итерировать от 1 до NN и на каждом шаге добавлять 1k!\frac{1}{k!} в сумму.
  3. Выводить результат с точностью до 5 знаков после запятой.

Реализация на C++:

cpp
#include #include // Для управления точностью вывода

using namespace std;

int main() { int N; cin >> N; // Вводим число N double sum = 1.0; // Начальная сумма, первая часть 1 double factorial = 1.0; // Начальный факториал для 1! = 1 for (int i = 1; i <= N; ++i) { factorial *= i; // Вычисляем текущий факториал sum += 1.0 / factorial; // Добавляем 1/k! к сумме } cout << fixed << setprecision(5) << sum << endl; // Выводим результат с точностью до 5 знаков return 0; }

Объяснение кода:

  1. Ввод числа N. Читаем натуральное число NN, до которого будем вычислять сумму.
  2. Переменная sum. Начинаем с суммы, равной 1 (первый элемент последовательности).
  3. Переменная factorial. Инициализируем её значением 1, так как 1!=11! = 1. В цикле на каждом шаге вычисляем новый факториал, умножая его на ii, где ii — текущий индекс в цикле.
  4. Цикл. В цикле от 1 до NN добавляем к сумме дробь 1/factorial1 / factorial, где factorialfactorial — это текущее значение факториала для числа ii.
  5. Вывод. Используем функцию cout с манипулятором setprecision(5) для вывода числа с точностью до 5 знаков после запятой.

Пример 1:

Вход:

1

Шаги выполнения:

  1. Начальная сумма = 1.
  2. 1!=11! = 1, добавляем 11!=1\frac{1}{1!} = 1 к сумме.
  3. Итоговая сумма = 1 + 1 = 2.

Выход:

2.00000

Пример 2:

Вход:

3

Шаги выполнения:

  1. Начальная сумма = 1.
  2. 1!=11! = 1, добавляем 11!=1\frac{1}{1!} = 1.
  3. 2!=22! = 2, добавляем 12!=0.5\frac{1}{2!} = 0.5.
  4. 3!=63! = 6, добавляем 13!=0.16667\frac{1}{3!} = 0.16667.
  5. Итоговая сумма = 1 + 1 + 0.5 + 0.16667 = 2.66667.

Выход:

2.66667

Важные замечания:

  • Если N=1N = 1, то результат будет просто 22, как в первом примере.
  • Точность вывода устанавливается с помощью setprecision(5), что позволяет выводить результат

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос