题解
求出e的值
1 条题解
-
0
P4352 求出e的值(【基础】)
解题思路
数学里的自然常数 可以这样累加:$e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\cdots+\frac{1}{n!}$。题目给了 (最大 15),我们把每一项加起来就行。
关键是不要每次重新算阶乘。第 项的阶乘 ,所以只要用一个变量
f记着上一项的阶乘,每次乘上 就得到 ,再算 加进e里。拿样例 来说,程序会把 到 全部加上,得到 ,保留 10 位小数输出
2.7182818011,和样例一致。两个细节:
- 分数要用
1.0 / f而不是1 / f。整数除整数会直接丢掉小数变成 0,写1.0才能得到小数结果; - 题目要求保留小数点后 10 位,用
printf("%.10lf\n", e)输出即可。
边界情况: 最小是 2, 和 这两项都要算上。 最大 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; }复杂度分析
循环 次, 最大 15,所以时间复杂度是 。只用了两个
double变量和一个整数,额外空间复杂度是 。 - 分数要用
- 1