《VB常用十大算法(共16页).doc》由会员分享,可在线阅读,更多相关《VB常用十大算法(共16页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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 C
2、ommand1_Click()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、算法说明 在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。求最小值的方法类同。求若干数平均值,实质上就是先求和,再除以这些数的个数。应用
3、举例:随机产生n个1-100(包括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 = save
4、r = aver + sNext i aver = aver / n Print max=; max; min=; min; aver=; averEnd Sub解题技巧:最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。3. 素数问题1、算法说明 素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。 判别某数m是否是素数的经典算法是: 对于m,从I2,3,4,m1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则
5、m是素数。 Private 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 The
6、n Exit FunctionNext 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以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小
7、于该素数shu的数I,如果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 p
8、f(ByVal shu As 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,将余数反序即得到结
9、果。 算法实现: Private 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) -
11、i) Next i Tran = 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
12、Mod n = 0 3为最大公约数。(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算法实现
13、: 递归Private Function 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
14、) 从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;(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
15、 Integer, temp 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
16、End Sub 调用该过程示例: 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)冒泡法排序 选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒
17、出。 譬如: 8 6 9 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 D
18、ouble For i = 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
20、If mid = (low + 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
21、 End Sub 2)统计 :统计字符或者数字出现的次数。 算法说明 :以字符统计为例,设基本问题如下:请统计一段文本中英文字母在文本中出现的次数。(不区分大小写) 如:I am a student. 得到:A:2 d:1 e:1 I:1 m:1 n:1 s:1 t:2 u:1 分析:由于不区分大小写,因此可定义一个大小为26(下标:025)的数组,每个元素依次记录A、B、CZ字母出现的次数。 A(0)存放字母a出现的次数 A(1)存放字母b出现的次数 A(2)存放字母c出现的次数 代码如下: Option Explicit Private Sub Command1_Click() Dim i
22、 As Integer, j As Integer, zimu(25) As Integer, allStr As String, aStr As String allStr = UCase(Text1.Text) For i = 1 To Len(Text1.Text) aStr = Mid(allStr, i, 1) If aStr = A And aStr = Z Then zimu(Asc(aStr) - Asc(A) = zimu(Asc(aStr) - Asc(A) + 1 End If Next i For i = 0 To 25 If zimu(i) 0 Then j = j + 1 Text2.Text = Text2.Text & Chr(i + Asc(A) & : & str(zimu(i) & If j Mod 5 = 0 Then Text2.Text = Text2.Text & Chr(13) & Chr(10) End If Next i End Sub 解题技巧:熟练运用字符处理函数,对于一些数论题,譬如逆序数等也可将数字通过CStr函数转换为字符后,利用字符处理函数来解题。专心-专注-专业