主题:请教算法的问题
suiyue
[专家分:20] 发布于 2006-06-12 22:00:00
我遇到一道例题如下:
求1/1!+1/2!+1/3!+。。。。。+1/100!的和
请问高手这类题的详细解答过程是怎么的?作为新人应该怎么去思考?欢迎新手共同讨论学习,更欢迎高手的讫临指导.
回复列表 (共15个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2006-06-11 20:50:00
你没有打错字吧?求1/1!+1/2!+[color=FF0000]3[/color]/3!+。。。。。+1/100!的和
这道题,说来不难。但要做好,尽量减少运算就有些技巧了
第一,总体来看,是一个累加过程。
在看每一项,都是前一项除以该项的序号。
所以,可以编写程序如下:
s=0
k=1
for i=1 to 100
k=k/i
s=s+k
next i
? s
end
全部程序就这样,代码不多,运算也不多。
一共304步操作。
板凳
moz [专家分:37620] 发布于 2006-06-11 21:23:00
请问,你运行过吗?
3 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-11 21:31:00
答二楼:我的机器没有安装qb,所以…………
有什么话就直说吧
4 楼
wyj770927 [专家分:10] 发布于 2006-06-12 17:13:00
运行正确
5 楼
suiyue [专家分:20] 发布于 2006-06-12 20:01:00
我今天上班的时候想了想 我是这样思考的:
分两个过程,一是求每个分母的阶乘 二是把每项加起来
于是我就这样:
t=1:i=1:s=0
do while i<=100
t=t*i '求分母的阶乘
s=s+1/t '求每一相的累加和
i=i+1
loop
print s
现在我才下班到家 还没来得及验证哈
我是新手还希望大虾们多指点
6 楼
JRX [专家分:180] 发布于 2006-06-12 21:29:00
1/1!+1/2!+1/3!+。。。。。+1/100!的和
也可以用子程序做~
CLS
S=0
FOR I=1 TO 100
GOSUB 100
S=S+1/T
NEXT I
PRINT S
END
100:
T=1
FOR J=1 TO I
T=T*J
NEXT J
RETURN
我没运行,不知道对不对
7 楼
suiyue [专家分:20] 发布于 2006-06-12 21:58:00
看不懂子程序,不过还是支持下,较满意,我也后学了子程序再去验证下,我要努力争取在九月顺利过二级.不知道我的那种方法怎么样?请高手裁决下我的算法的缺点,那些需要改进的?还有更简洁的方法没有?
8 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-16 21:04:00
使用子程后程序的效率降低很多!共调用子程100此,做乘法(1+99)*100/2=5000次,而不是用子程,乘法只计算99次或100次!
效率,是程序的生命!
9 楼
moz [专家分:37620] 发布于 2006-06-17 13:50:00
看了以上那么多的纸上谈兵.
我忍不住要说几句.
1. 题目中的叹号!估计是阶乘的意思,应该不是QB里的单精度后缀吧,
一楼对数学很拿手
阶乘放在VB里是一个很简单很小的好程序,
但在QB里,阶乘超过35的,都溢出
而一楼的程序刚好避开了这个问题,的确很不错.
只是不能一下子看得出来.
2. 使用子程后程序的效率降低很多!
六楼的程序里,只是使用不当,而且还会溢出,但不能说是子程序的过错.
效率这东西要看时间空间的优先.
很多的时候相互会有转化和牺牲.
现代不再推荐使用gosub的子程,而应该多用结构化的SUB子程或函数FUNCTION
10 楼
老大徒伤悲 [专家分:29120] 发布于 2006-06-17 14:54:00
也许9楼对我在一楼的评价是对的,也许是错的。
实践出真知,斗争长才干!
因为,我的机器没有装qb,所以…………
为了谨慎,我在vb环境下是运行了该代码,才帖上来的
也许两者有所不同。
如果错了,请方家帖出合适的代码;
如果和我一样的坐而论道,嘿嘿,就没有意思了
我来回复