top1编程
← 返回题目
题解

求出e的值

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4352 求出e的值(【基础】)

    解题思路

    数学里的自然常数 ee 可以这样累加:$e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\cdots+\frac{1}{n!}$。题目给了 nn(最大 15),我们把每一项加起来就行。

    关键是不要每次重新算阶乘。第 ii 项的阶乘 i!=(i−1)!×ii! = (i-1)! \times i,所以只要用一个变量 f 记着上一项的阶乘,每次乘上 ii 就得到 i!i!,再算 1.0/f1.0/f 加进 e 里。

    拿样例 n=10n=10 来说,程序会把 11!\frac{1}{1!} 到 110!\frac{1}{10!} 全部加上,得到 e≈2.718281801146⋯e≈2.718281801146\cdots,保留 10 位小数输出 2.7182818011,和样例一致。

    两个细节:

    • 分数要用 1.0 / f 而不是 1 / f。整数除整数会直接丢掉小数变成 0,写 1.0 才能得到小数结果;
    • 题目要求保留小数点后 10 位,用 printf("%.10lf\n", e) 输出即可。

    边界情况:nn 最小是 2,1!1! 和 2!2! 这两项都要算上。nn 最大 15 时,15!15! 很大,但阶乘变量用 double 存,精确度足够输出 10 位小数。

    参考代码

    // 利用公式 e=1+1/1!+1/2!+...+1/n! 求e,保留10位小数
    #include <cstdio>
    using namespace std;
    
    int main() {
        int n;
        scanf("%d", &n);
        double e = 1;      // 第一项就是1
        double f = 1;      // 阶乘,从1!开始
        for (int i = 1; i <= n; i++) {
            f *= i;        // 得到i的阶乘
            e += 1.0 / f;  // 累加1/i!
        }
        printf("%.10lf\n", e);   // 保留10位小数输出
        return 0;
    }
    

    复杂度分析

    循环 nn 次,nn 最大 15,所以时间复杂度是 O(n)O(n)。只用了两个 double 变量和一个整数,额外空间复杂度是 O(1)O(1)。

    • 1