用C++求一个有关阶乘的数学常量的e值。

infinite_loop 2008-05-02 11:47:45
假如你在一个C++教程上看到这样一个习题,你会用什么样的方法来求解:

写一个程序,用公式e=1+1/1!+1/2!+1/3!+...估算数学常量e的值。

由于习题没具体要求精度,所以要求你自己做一个合适的判断,不要让程序做无用的计算,并尽量精确。
请说出具体的思路及代码。

不要问多余的问题,这只是一本教程上的习题,他只告诉你这么多。

...全文
584 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
infinite_loop 2008-05-02
  • 打赏
  • 举报
回复
飞雪的答案我比较满意,jc在大于1e+10后马上中止,算法也比较高明。把低数位阶乘直接拿到高数位阶乘去用。
避免了像七楼重复计算的资源耗费。而且你有没想过10000!是什么概念。不过还是辛苦了,可能你一时没考虑那么多。

要是还有人说一下精度的问题就好了。再等半小时结贴。
infinite_loop 2008-05-02
  • 打赏
  • 举报
回复
程序我也会写,但我就是不知道该在什么时候终止循环。
也就是判断什么时候计算出来的是无用的。
比如要求你小数点后两位精度,那该用什么条件来终止循环,能得到完全正确的答案,又不会浪费资源。
还有1.0 >= (1e-10) * jc;请解释一下!
zycy 2008-05-02
  • 打赏
  • 举报
回复
貌似只有裸算吧,网上搜也没见到有什么好的方案
裸算的话算到n复杂度是O(n)
关注关注
infinite_loop 2008-05-02
  • 打赏
  • 举报
回复
我要的是你所估算精度的含义。像飞雪写的(1.0 >= eps * jc).你写的10000
baihacker 2008-05-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 infinite_loop 的回复:]
说下思路啊,大脑不大好使。
[/Quote]
循环的终止判断条件为
每次循环中加上的那个数大于超过事先设定的值就进行
否则就中止
daiguoliangfirst 2008-05-02
  • 打赏
  • 举报
回复
思路:
先编一个阶乘的函数,但是要注意此时的返回类型应当为double或者float型
然后在主函数里面用一个for循环来估算,for的循环次数在一定程度上可以认为就是估算的精度
代码如下
#include<stdio.h>
double jiecheng(double n)
{
if(n==0 || n==1)return 1;
else return n*jiecheng(n-1);

}
int main()
{
double sum=0;
for(int i=0;i<10000;i++)
sum+=1/jiecheng(i);
printf("\n%f\n",sum);
return 0;
}
infinite_loop 2008-05-02
  • 打赏
  • 举报
回复
说下思路啊,大脑不大好使。
baihacker 2008-05-02
  • 打赏
  • 举报
回复
将2楼和4楼结合才是符合要求的
baihacker 2008-05-02
  • 打赏
  • 举报
回复
	
//呵,这样就行了
for (int i = 1; 1.0 >= eps * jc; ++i)
{
jc *= i;
result += 1.0/jc;
}
infinite_loop 2008-05-02
  • 打赏
  • 举报
回复
很强!这么快!请说说n为什么要取100。
baihacker 2008-05-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
const double eps = 1e-10;
double result = 1;
double jc = 1;
for (int i = 1;; ++i)
{
jc *= i;
result += 1.0/jc;
if (1.0 < eps * jc) break;
}
cout.precision(16);
cout << result << endl;
return 0;
}
baihacker 2008-05-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

int main()
{
const int n = 100;
double result = 1;
double jc = 1;
for (int i = 1; i <= n; ++i)
{
jc *= i;
result += 1.0/jc;
}
cout.precision(16);
cout << result << endl;
return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧