VB常用十大算法_第1页
VB常用十大算法_第2页
VB常用十大算法_第3页
VB常用十大算法_第4页
VB常用十大算法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 累加与连乘1、算法说明 分析累加形式:V=V+e 连乘形式:V=V*e其中:V是变量,e是递增表达式。累加和连乘一般通过循环结构来实现。注意:需在执行循环体前对变量V赋初值。一般累加时置初值0;连乘时置初值为1。举例求N!的结果。Private Sub Command1_Click() Dim n%, i%, s& n = Val(InputBox(输入n) s = 1 For i = 1 To n s = s * i Next i Print sEnd Sub应用举例 根据下列公式,求自然对数e的的近似值。要求:误差小于0.00001Private Sub Command1_Click

2、()Dim i%, n&, t!, e!e = 2 i = 1 t = 1 Do While t 0.00001i = i + 1t = t / ie = e + tLoop Print 计算了; i; 项目和是:; ePrint Exp(1) 与上句输出值进行对比以证明算法的正确性End Sub2. 最值问题1、算法说明 在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。求最小值的方法类同。求若干数平均值,实质上就是先求和,再除以这些数的个数。应用举例:随机产生n个1-10

3、0(包括1和100)的数,求它们的最大值、最小值和平均值。Private Sub Command1_Click()Dim n%, i%, min%, max%, aver!, s% n = Val(InputBox(输入个数:)s = Int (Rnd * 100) + 1 max = s : min = s : aver = s Print 第1个数是: & s For i = 2 To ns = Int(Rnd * 100) + 1 Print 第 &i & 个数是: & sIf s max Then max = sIf s min Then min = saver = aver + sN

4、ext i aver = aver / n Print max=; max; min=; min; aver=; averEnd Sub解题技巧:最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。3. 素数问题1、算法说明 素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。 判别某数m是否是素数的经典算法是: 对于m,从I2,3,4,m1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。 Private

5、 Function sushu(ByVal n As Integer) As Boolean Dim i As Integer For i = 2 To n - 1 If (n Mod i) = 0 Then Exit For Next I If I = n then sushu=True End Function 很显然,实际上,我们可以改进上面 Private Function sushu(ByVal n As Integer) As Boolean Dim i as IntegerFor i = 2 to Int(Sqr(n)If X Mod i = 0 Then Exit Functi

6、onNext isushu = TrueEnd Function这样可以很好的提高效率。 以上判断是否为素数的代码务必识记! 应用举例:求100200之内素数。 Private Sub Command1_Click() Dim j As Integer For j = 100 To 200 If sushu(j) = True Then Print j End If Next j End Sub 实例说明 编程题 : 找出10000以内所有可以表示为两个平方数和的素数。 思路:首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果

7、I和shuI均为平方数,则说明其可以表示为两个平方数之和。) 判断数I是否为平方数的方法:Sqr(i) = Int(Sqr(i) Private Sub Command1_Click() Dim j As Integer, m AsInteger, n As Integer For j = 2 To 10000 If sushu(j) = True Then If pf(j, m, n) = True Then List1.AddItem j & = & m & + & n End If End If Next j End Sub Private Function pf(ByVal shu A

8、s Integer, m As Integer, n As Integer) As Boolean Dim i As Long For i = 1 To shu - 1 If (Sqr(i) = Int(Sqr(i) And (Sqr(shu - i) = Int(Sqr(shu - i) Then pf = True m = i n = shu - i Exit Function End If Next End Function 4. 进制转换1、算法说明 1) 十进制正整数m转换为R(216)进制的字符串。 思路:将m不断除r取余数,直到商为0,将余数反序即得到结果。 算法实现: Priv

9、ate Function Tran(ByVal m As Integer, ByVal r As Integer) As String Dim StrDtoR As String, n As Integer Do While m o n = m Mod r m = m r If n 9 Then StrDtoR = Chr(65 + n - 10) & StrDtoR Else StrDtoR = n & StrDtoR End If Loop Tran = StrDtoR End Function 2) R(216)进制字符串转换为十进制正整数。 思路:R进制数每位数字乘以权值之和即为十进制

10、数。 算法实现: Private Function Tran(ByVal s As String, ByVal r As Integer) As Integer Dim i as Integer, n As Integer, dec As Integer s = UCase(Trim(s) For i = 1 To Len(s) If Mid(s, i, 1) = A Then n = Asc(Mid(s, i, 1) - Asc(A) + 10 Else n = Val(Mid(s, i, 1) End If dec = dec + n * r (Len(s) - i) Next i Tra

11、n = dec End Function 解题技巧:进制转化的原理要清楚,同时编写代码时候要留意16进制中的AF字符的处理。 算法(五)约数因子- -5. 最大公约数、最小公倍数1、算法说明 1)最大公约数:用辗转相除法求两自然数m、n的最大公约数。(1) 首先,对于已知两数m、n,比较并使得mn;(2) m除以n得余数r;(3) 若r0,则n为求得的最大公约数,算法结束;否则执行步骤(4)分析步骤:m = 24,n = 924与9 r = m Mod n = 6 r0,m = 9,n = 6 r = m Mod n = 3 r0,m = 6,n = 3 r = m Mod n = 0 3为最

12、大公约数。(4) mn nr 再重复执行(2)分析步骤: 10与5m = 10,n = 5r = m Mod n = 0所以n(n=5)为最大公约数算法实现: 循环Private Function GCD(ByVal m As Long, ByVal n As Long) As Long Dim temp As Long, r As Long If m n Then temp = m: m = n: n = temp Do r = m Mod n If r = 0 Then Exit Do m = n n = r LoopGCD = nEnd Function算法实现: 递归Private F

13、unction GCD(ByVal m As Long, ByVal n As Long) As LongDim temp As Long, r As LongIf m n Then temp = m: m = n: n = tempr = m Mod nIf r = 0 Then GCD = nElse m = n n = r GCD = GCD(m, n)End IfEnd Function2)最小公倍数:mn最大公约数3)互质数:最大公约数为1的两个正整数解题技巧:该算法需要识记!这种类型题目的扩展是约数和因子题型。6. 排序1、算法说明 1) 选择法排序 (1) 从n个数中选出最小数的

14、下标,出了循环,将最小数与第一个数交换位置;(2) 除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位置;(3) 以此类推,最后构成递增序列。 譬如: 869327 第一轮交换后269387 第二轮交换后239687 第三轮交换后236987 第四轮交换后236789 第五轮无交换236789 程序代码如下: Private Sub xzPaiXu(a() As Double, sheng As Boolean) a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。 Dim i As Integer, j As Integer, tem

15、p As Double, m As Integer For i = LBound(a) To UBound(a) - 1 进行数组大小-1轮比较 m = i 在第i轮比较时,假定第i个元素为最值元素 For j = i + 1 To UBound(a) 在剩下的元素中找出最值元素的下标并赋值给m If sheng Then 若为升序,则m记录最小元素下标,否则记录最大元素下标 If a(j) a(m) Then m = j End If Next j temp = a(i): a(i) = a(m): a(m) = temp 将最值元素与第i个元素交换 Next i End Sub 调用该过程

16、示例: Option Base 1 Private Sub Command1_Click() Dim b(6) As Double b(1) = 8 : b(2) = 6 : b(3) = 9 : b(4) = 3 : b(5) = 2 : b(6) = 7 Call xzPaiXu(b, True) For i% = 1 To 6 Print b(i) Next End Sub 2)冒泡法排序 选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。 譬如: 8 6 9

17、3 2 7 第一轮排序:从右至左将最小的数移至最右边。8 6 9 3 2 7 8 6 9 2 3 7 8 6 2 9 3 7 8 2 6 9 3 7 2 8 6 9 3 7 . 2 3 8 6 9 7 . 2 3 6 8 7 9 . 2 3 6 7 8 9 . 2 3 6 7 8 9 程序代码如下: Private Sub mpPaiXu(a() As Double, sheng As Boolean) a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。 Dim i As Integer, j As Integer, temp As Double For i =

18、 LBound(a) To UBound(a) - 1 进行n-1轮比较 For j = UBound(a) To i + 1 Step -1 从n到i个元素两两进行比较 If sheng Then 若次序不对,马上进行交换 If a(j) a(j - 1) Then temp = a(j) : a(j) = a(j - 1) : a(j - 1) = temp End If End If Next j 出了内循环,一轮排序结束,最值元素冒到最上边 Next i End Sub 数组元素插入删除- -7. 在数组中插入或删除元素1、算法说明 数组中元素的插入和删除一般是在已固定序列的数组中插入

19、或删除一个元素,使得插入或删除操作后的数组还是有序的。 基本思路:首先要找到插入位置或要删除的元素。 1)插入代码如下: Private Sub Command1_Click() Dim a(10) As Integer, i As Integer, k As Integer For i = 0 To 9 生成数组 a(i) = i * 3 + 1 Print a(i); Next i Print Print 插入14 For k = 0 To 9 查找插入14在数组中的位置 If 14 high Then 没有查找到 index = -1 Exit Sub End If mid = (low

20、 + high) 2 取查找区间的中点 If Key = a(mid) Then 查找到,返回下标 index = mid Exit Sub ElseIf Key Asc(Z) Then iAsc = iAsc - 26 Code = Code & Chr(iAsc) Case a To z iAsc = Asc(c) + 5 If iAsc Asc(z) Then iAsc = iAsc - 26 Code = Code & Chr(iAsc) Case Else Code = Code & c End Select Next i Text2.Text = Code End Sub 2)统计 :统计字符或者数字出现的次数。 算法说明 :以字符统计为例,设基本问题如下:请统计一段文本中英文字母在文本中出现的次数。(不区分大小写) 如:I am a student. 得到:A:2 d:1 e:1 I:1 m:1 n:1 s:1 t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论