1、算法说明
$ c4 y J. E% X, D* u. B4 M 累加形式:V=V+e
4 c% @" H5 N& K 连乘形式:V=V*e 6 t% n5 N( u- R1 i/ v4 m
其中:V是变量,e是递增表达式。累加和连乘一般通过循环结构来实现。
2 }/ k4 j- l( O: g9 | 注意:需在执行循环体前对变量V赋初值。一般的,累加时置初值0;连乘时置初值为1.
% z3 K* }3 r+ C. I1 w* W. ` 举例 : J& z) U2 @: S5 P
求N!的结果。
8 @* V* `! \+ L* |! I1 J Private Sub Command1_Click() , `" {, Y: D1 X4 y
Dim n%, i%, s&
( o. X- D" K/ `3 n z2 A n = Val(InputBox("输入n")) , P. K+ x, ]' B+ @! l- {- U
s = 1
3 n; V% a. F& I8 _" c: o For i = 1 To n * B1 t# _9 J5 T. \, ^' A
s = s * i 4 m3 H0 o5 u. j
Next i
) N& [, x7 h* R" C# U Print s & I, h# }7 e7 j# u& `2 m1 A
End Sub $ n$ s% T+ s) E) g( h! X5 g
错误的写法: * E4 b5 |; f/ ?6 z
Private Sub Command1_Click() V- Y# J7 H5 M
Dim n%, i%, s& & G$ Q3 ]4 L9 x) t$ h) b; j
n = Val(InputBox("输入n")) ) Z, B0 J6 J+ |% ~# D
For i = 1 To n / S0 E4 U2 K( O1 ~' c3 V) @
s = 1 ‘赋初值语句位置不对!
/ z$ D$ h. @8 U# C. K/ ]1 u { s = s * i
) w% e8 z" h) K$ o. A. m Next i
5 b& K5 D) ^$ w4 T Print s ‘输出s的值为n,而不是n!
6 X7 R3 |% g* v; g1 T End Sub
# _) c1 u- D3 b2 U& ~3 [ 应用举例
9 J1 u3 `+ `. ~0 N( ~6 q. b 根据下列公式,求自然对数e的的近似值。 4 k/ p7 @1 y+ w( y
! ]) @4 H1 Y& o9 [3 _ 要求:误差小于0.00001
- x4 [4 t& }% d5 ]0 F Private Sub Command1_Click() . i9 T* [. a4 F1 ^
Dim i%, n&, t!, e! : B2 O3 D7 U q4 ?% v6 C
e = 2
4 m; A3 a. K7 Q1 V& D i = 1
- ~6 A; A* U8 u& X t = 1
4 h8 P: [/ e9 c& O$ S7 |. Z- }9 Y Do While t > 0.00001
. ?, e2 v2 h/ ^6 N i = i + 1 1 t! W4 u0 R7 h; }
t = t / i : Y2 O) H9 H* T/ ]# V, m# E
e = e + t
! J# H, n/ H' `6 y Loop
+ d! o! q& ]$ K7 J2 t5 k Print "计算了"; i; "项目和是:"; e
$ ]' U6 O5 j4 \* F$ H' T+ Q Print Exp(1) ‘与上句输出值进行对比以证明算法的正确性 % I. B! K1 [, `$ ^( q
End Sub % n! n5 b/ E, v; v" [9 g8 o0 C
解题技巧 * d' k5 G& X, @) k- Q
1) 由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。设定循环变量和通项变量,注意各变量的初值;
/ D V" t! }2 ?4 p 2) 分解通项表达式中各因子,并分别将各因子用循环变量表示; ( ^4 k7 V5 E9 L, L0 `
3) 如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程; $ ?9 R, ] ], v1 n
4) 根据步骤1、2、3,写出通项表达式;
$ R2 |6 j) @9 x; @2 }) K) f8 x 5) 根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。通常是用:if 通项表达式>10^(-N) then exit do ,注意这句话一般需放在累加或者连乘式之前。 |