【题目链接】
ybt 1092:求出e的值
OpenJudge NOI 1.5 35:求出e的值
【题目考点】
1. 求一个数的阶乘
假设求n的阶乘,设结果变量为r,其初值为1。
i从1循环到n,每次循环将i与r相乘,结果赋值给r。
最后得到的r就是阶乘的结果
int f(int n)//求n的阶乘函数,返回值是n的阶乘。
{
int r = 1;
for(int i = 1; i <= n; ++i)
r *= i;
return r;
}
2. 求和
3. 循环嵌套
【注意事项】
由于本题中n的最大值是15,而
15
!
15!
15!的值为1307674368000,共13位,超出了int型量可以表示的范围。
因此保存阶乘值的类型设为double
【思路及题解代码】
解法1:循环嵌套
在求和的循环内部,实现求 1 i ! \frac{1}{i!} i!1的逻辑
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
double sum = 1, v;//sum:和,初始值是1,再分别加各个项。v:某一项的值
for(int i = 1; i <= n; ++i)
{
v = 1;
for(int j = 1; j <= i; ++j)//求1 / i!
v *= 1.0 / j;
sum += v;
}
cout<<fixed<<setprecision(10)<<sum;
return 0;
}
解法2:设置阶乘函数
循环加和,在循环中调用阶乘函数,求数i的阶乘 i ! i! i!,继而求出 1 i ! \frac{1}{i!} i!1,将其加入和中。
#include <bits/stdc++.h>
using namespace std;
double f(int n)//求n的阶乘
{
double r = 1;
for (int i = 1; i <= n; ++i)
r *= i;
return r;
}
int main()
{
int n;
cin>>n;
double sum = 1;//和的初始值是1,再分别加各个阶乘项
for(int i = 1; i <= n; ++i)
sum += 1 / f(i);
cout<<fixed<<setprecision(10)<<sum;
return 0;
}
解法3:
观察公式,不看最初的1,从1!开始算第1项。第1项是
1
1
!
\frac{1}{1!}
1!1,第2项是
1
2
!
\frac{1}{2!}
2!1,…,第i-1项是
1
(
i
−
1
)
!
\frac{1}{(i-1)!}
(i−1)!1,第i项是
1
i
!
\frac{1}{i!}
i!1
已知
1
i
!
=
1
i
⋅
1
(
i
−
1
)
!
\frac{1}{i!} = \frac{1}{i} \cdot \frac{1}{(i-1)!}
i!1=i1⋅(i−1)!1
只需要设变量v表示某一项的值,初值为1。
每次循环,对v除以i,即可得到新的一项,并将该项加入和sum中。
该解法的时间复杂度为
O
(
n
)
O(n)
O(n),优于解法1,2。
#include <bits/stdc++.h>
using namespace std;
int main()
{
double sum = 1, v = 1;//s为加和,v为每一项的值
int n;
cin>>n;
for(int i = 1; i <= n; ++i)
{
v /= i;
sum += v;
}
cout<<fixed<<setprecision(10)<<sum;
return 0;
}