a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 78|回复: 1

[考试试题] 计算机等级考试二级VB常用算法(3):素数

[复制链接]
发表于 2012-7-31 22:15:04 | 显示全部楼层 |阅读模式
  1、算法说明
1 O2 }3 K( o6 Q4 L7 x& G素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。
3 _: ~& j# F1 s$ ^! \- n6 P8 U判别某数m是否是素数的经典算法是: ( ]+ o" X! J" L+ ]  l
对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。 0 M9 {9 _! s5 Q. C' R
Private Function sushu(ByVal n As Long) As Boolean
2 V2 Z6 T/ ^# F/ N! t0 X    Dim i As Long
% z! M: f0 ~" D) i, F    For i = 2 To n - 1
2 w$ [3 `: j5 M( E# J$ a0 Z3 G7 _    If (n Mod i) = 0 Then Exit For
+ V5 ~! I' F( L, F. R5 ENext I 2 p8 P2 I7 z% s# T' |; @6 _$ t4 O! ^
If I=n then sushu=True . O9 o/ j2 _7 i9 w
End Function * C& C& G( R' R5 S( L
很显然,实际上,我们可以改进上面
; N  z; k1 t3 t# u" B- kFor i = 2 To n – 1
# D1 M+ |; U7 Q- X7 M4 l为: 0 C# u3 E: K- }5 E6 [6 }) O
For i = 2 To int(sqr(m))
3 u7 k" n( u" p& g& o这样可以很好的提高效率。
+ m4 l$ t2 P* b1 U" j以上判断是否为素数的代码务必识记!
& [4 }* X, I/ f$ Y. F应用举例 ! m% \* z7 W/ W7 ^9 j
求100-200之内素数。 8 z6 O8 {  s& ^' H' R" O6 Q
Private Sub Command1_Click() 5 }* D' a; o3 b  X$ a+ R
    Dim j As Integer ; u4 Z! T: G* q& }, m- G2 p5 Z- p  M
    For j = 100 To 200 ; z& f$ e- v- X6 [0 J, i5 e
        If sushu(j) = True Then 8 ]- ~/ `, c) }- R7 g' z; |
        Print j
9 Q  K) [/ ?( d1 u8 ~        End If 2 V6 e6 C, c% r
    Next j
( Y3 W  ?0 [  Y  _End Sub
! B( b4 d8 R2 T! w2 k* |解题技巧 5 l% ?3 N$ ^6 t1 A; Z
识记判断素数的算法过程,根据题意,灵活调用! 5 _6 C" V. G3 |) ~" h
实例说明
' \& w2 O, J) k* d0 X1 A编程题(2002年春上机试卷04)
9 S# F: K6 p  Z: F$ j         找出10000以内所有可以表示为两个平方数和的素数。 7 ^0 d! E( h1 ?, E
思路: / J6 Z5 ?9 C; C3 W; B
首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明其可以表示为两个平方数之和。)   ]) p% I0 M/ f
判断数I是否为平方数的方法:sqr(i)=int(sqr(i)) / E* b/ l0 W7 }& m3 z
Private Sub Command1_Click()
( L- x1 x! o" ]2 x8 F1 o+ P3 `, n    Dim j As Integer ; r0 y: C( C* L+ M* g# l
    Dim m As Long, n As Long
3 p, f2 F1 c, U1 S" m' _    For j = 2 To 10000
1 J% g: v( Q  A5 t        If sushu(j) = True Then - {$ v( q" D5 G* v
            If pf(j, m, n) = True Then 5 v# ]8 [( j7 `- w
                List1.AddItem j & "=" & m & "+" & n / S( \6 R0 u9 u
            End If ' Z+ k6 k* ^4 o0 N( O
        End If   k6 W( V, o, O4 T5 I0 e
    Next j ' @# m8 t% ^0 B
End Sub
) `- ^% ~1 G7 a7 dPrivate Function pf(ByVal shu As Long, m As Long, n As Long) As Boolean
$ k6 J" ^3 Q9 T% m( F+ |- K" g' L    Dim i As Long
2 X7 {. q1 m& m: S9 A    For i = 1 To shu - 1
/ e6 H$ G2 s! C# {  i1 m        If (Sqr(i) = Int(Sqr(i))) And (Sqr(shu - i) = Int(Sqr(shu - i))) Then
( i& Y# Q! w, D" U            pf = True / _5 k7 |/ T6 F7 y. b" }+ S
            m = i
& G( n4 g( E3 u3 X+ {            n = shu - i 4 Z( |9 J8 [5 C7 x* l) h
            Exit Function 4 m' G  {% P* J; y: R
        End If ; |3 J4 Y- h1 L0 o9 j
    Next
5 c. Y6 W+ z: U3 O) y1 x1 w5 R2 m: ^% }" S6 \4 U2 g8 D
End Function
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:15:05 | 显示全部楼层

计算机等级考试二级VB常用算法(3):素数

</p>  ( x- {3 z% k9 k* ~" p& S  J
2、实战练习
3 w6 \3 w6 M& E6 y1)        补充代码(2002春二(7))
7 n' X" e0 a! Y8 o. O" X: ~下列程序的功能是:查找四位正整数中的超级素数。超级素数的定义为:当一个素数从低位到高位依次去掉一位数后剩下的数仍然是素数,则此数为超级素数。如数2333、233、23、2均为素数,所以2333为超级素数。
/ k) L' t2 ~5 j) Y9 b' b                  Option Explicit - R1 A7 k; Q7 V) W6 @% |
                  Private Sub Command1_Click() % w; p# d, h7 H9 {, p( M
                           Dim I As Integer, flg As Boolean
$ [/ k* Q- v6 K. g                     For I = 1001 To 9999 Step 2 2 }- K2 o: c6 Y# x$ m* n
                        Call sup_prime(I, flg)
" A0 F, c& Q* j$ V- h) [+ U                       If flg Then
: _  s5 @4 o- M* F7 A$ a- v  r                        Debug.Print I / y) t; B- r& J$ q$ p( ~
                      End If
3 u" A& j6 ]  e7 X                   Next I
# l2 [. `. V/ x1 J4 s# W6 R3 [                 End Sub
/ J& l0 x: [4 @/ y7 b4 x- g) u7 G; o                  Private Sub sup_prime(  (1)  , F As Boolean) % E# F# ~$ [3 G" X. m+ f
                             Dim p As Integer , A( w  |# R  }2 F3 v
                        F = True . M7 ^6 o" e% Z
                                    Do While N > 0
5 G- d9 @  I! U) ~3 W                                   If prime(N) Then / J% _3 |; v; _1 Q1 |5 W/ P6 G- c
                                                       (2) $ B7 a5 p2 Q9 O2 T5 ~) F+ K
                               Else 0 i1 t9 H8 _) s
                                                 (3)
- z4 d5 O+ h% J- F                                 Exit Sub 1 Q% `+ `8 B8 o
                           End If / h# ]- }6 a/ F9 L* Q
                      Loop
+ A8 `4 L$ ~4 t( i% |                  End Sub
: u. V; {; W6 p4 u+ s                  Public Function prime(p As Integer) As Boolean
* \+ o. @9 t' v( X                                 Dim k As Integer
* I/ [  |0 g7 U) j* n8 V, t                                 If p = 1 Then 4 ?& u- V% m* v! j* b$ N
                                           Exit Function
1 b2 u" e" D; n7 K/ b                                   Else
2 I) f% V; M" p1 ]                                             For k = 2 To Sqr(p) / ~8 S- B( }# p: H# S8 L
                                          If p Mod k = 0 Then Exit Function 1 X$ P, q3 a% E0 P* U
                                          Next k
: [  w+ b$ Y2 u8 H                                              (4)
9 f/ b+ w6 M) z: m& i                          End If
* R2 B# r: M+ i* t2 r5 |, P" o: b                  End Function & r4 l) y5 \4 s
2)        编程题(2004春上机试卷03)
9 N( U, [. l0 ^4 o$ D% X         随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最大的素数,并给出它的位置。
$ V, X* k/ @, ^' C& Y
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-20 02:24 , Processed in 0.280489 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表