求出e的值

GitHub跳转原题关系图返回列表

用前缀积递推 k!,累加 1/k! 并保留 10 位小数输出。

OJ: roj

题目 ID: 1092

难度:入门

标签:入门数学浮点数

创建: 2026-09-29 18:16

更新: 2026-10-05 00:48

题目描述

给定整数 nn(2⩽n⩽152 \leqslant n \leqslant 15),按公式

e=1+11!+12!+⋯+1n!e = 1 + \frac{1}{1!} + \frac{1}{2!} + \cdots + \frac{1}{n!}

计算部分和,保留小数点后 10 位输出。

思路

维护一个递推的阶乘 fact,从 1!1! 乘到 n!n!,每步把 1/fact1/fact 累加到答案。这样一次扫描即可得到结果,时间复杂度 O(n)O(n)。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 18:16
# update_at: 2026-09-29 18:20

import sys
from itertools import accumulate
from operator import mul


def solve() -> None:
    data = iter(map(int, sys.stdin.buffer.read().split()))
    n = next(data)

    # accumulate 依次产出 1!, 2!, ..., n!(前缀积),对每项取倒数累加,再加首项 1
    e = 1.0 + sum(1.0 / f for f in accumulate(range(1, n + 1), mul))

    print(f"{e:.10f}")


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 00:48
 * update_at: 2026-10-05 00:48
 */
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll n;           // 累加项数上限
ll fact = 1;    // 当前 k!,从 1! 开始递推
double e = 1.0; // 部分和,先放入常数项 1

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;

    // 递推阶乘并累加 1/k!:fact 先乘 k 得到 k!,再取倒数加入 e
    for (ll k = 1; k <= n; k++) {
        fact *= k;
        e += 1.0 / fact;
    }

    cout << fixed << setprecision(10) << e << "\n";
    return 0;
}