VB编程用经常要要用到的算法(经典)
VB常用算法
常用算法1.判断素数素数是指只能被1与自己整除的数是素数,最小的素数是2,如3,5,7等都是素数判断方法一:Private Function Prime(N As Integer)As BooleanDim i As IntegerFor i=2 To N-1(或sqr(N)或N\2)If N Mod i=0 Then Exit ForNext i (或N/i=Int(N/i))If i=N Then Prime=TrueEnd Function判断方法二:Private Function Prime(N As Integer)As BooleanDim i As IntegerFor i=2 To N-1If N Mod i=0 Then Exit FunctionNext iPrime=TrueEnd Function(2)求最大公约数(欧几里德算法,辗转相除法)最大公约数是指两个数最大的公约数Private Function Gcd(byval m As Integer,ByVal n As Integer)As Integer Dim r As Integerr=m Mod nDo while r<>0m=nn=rr=m Mod nLoopGcd=nEnd Function利用递归实现判断最大公约数Private Function Gcd(ByVal m As Integer,ByVal n As Integer)As IntegerDim r As Integerr=m Mod nIf r=0 ThenGcd=nELseM=nn=rGcd=Gcd(m,n)End IfEnd Function(3)求因子算法与求完全数算法Private Sub factor(x As Integer,fn()As Integer)'动态数组fn用以存放所有的因子Dim i As Integer,n As IntegerFor i=1 To XIf x Mod i=0 Thenn=n+1Redim Preserve fn(n)fn(n)=iEnd IfNext iEnd Sub求完全数:完全数:整数N的因子和(其中因子包括1,不包括自身)等于NPrirate Function wanshu(N As Integer)As Boolean 'N为原数,sum为N的因子之和Dim i As Integer,sum As IntegerFor i=1 To N-1If N Mod i=0 Thensum=sum+iEnd IfNext iIf sum=N Then wanshu=TrueEnd Function(4)进制转换N进制--十进制如二进制转换为十进制采用从右向左每个数乘以其对应的幂值,如二进制10111=1×2^0+1×2^1+1×2^2+0×2^3+1×2^4=23,八进制转换为十进制采用从右向左每个数乘以其对应的幂值,如八进制25=5×8^0+2×8^1=21,十六进制转换为十进制采用从右向左每个数乘以其对应的幂值, 如十六进制A7=7×16^0+10×16^1=167(十六进制的范围是从0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个数,其中A表示10,B表示11,依次类推,F表示15)private sub zh1(a as string, N as integer,b as integer)'a为N进制数,b为转换后的十进制数,N 代表某种进制dim p as integer,i as integer,s1 as stringp=0for i=Len(a) to 1 step -1s1=Ucase(Mid(a,i,1))if s1>="A" And s1<="F" Then s1=Asc(s1)-55b=b+val(s1)*N^pp=p+1Next IEnd Sub十进制---- N进制:方法是除N逆序取余法,注意逆序如将十进制188转换为十六进制的方法是,除以16逆序取余法, 所以是274余数188/8 4(余数)23/8 7(余数)2/8 2(余数)Private Sub zh(a as integer,N as integer,b as integer)‘a为十进制数,b为转换后的N进制数,N代表某种进制dim r as integer, s as stringdo until a=0r=a mod n ‘r取余if r>9 then s=Chr(55+r) else s=Cstr(r)b=s & ba=a\NLoopEnd Sub(5)互质数:两个数的最大公约数为1Private Function reprime(a as integer, b as integer) as boolean dim i as integerfor i=2 to aif a mod i=0 and b mod i=0 then exit functionnext ireprime=trueEnd Function(6)回文数:左右对称的数为回文数(如121,13231)方法一:折半判断法Private Function compare(n as long) as booleanDim I as integer, s as string , slen as integers=Cstr(n): slen=Len(s)For i=1 to slen\2if mid(s,I,1)<>Mid(s,slen-i+1,1) Then Exit Function nextcompare=trueEnd Function方法二:根据定义:其逆序数(反序数)和原数相等的数为回文数Private Function compare(n as integer) as Booleandim I as integer, s1 as string,s2 as strings1=cstr(n)For i=1 to len(s1)s2=Mid(s1,I,1) & s2Next Iif s2=s1 then compare=trueEnd Function(7)最小公倍数方法一:最小公倍数=两数乘积/最大公约数private Function gcd(byval m as integer, byval n as integer) as integerdim r as integerdor=m mod nm=nn=rloop until r=0gcd=mFunctionprivate Function lcm(x as integer,y as integer) as integerlcm=(x*y/gcd(x,y))End Function方法二:穷举法,利用计算机运算速度快不易出错的特点,将所有的可能性一一尝试,直到得出结果private Function lcm(x as integer, y as integer) as integerdim i as longfor i=1 to x*yif I mod x=0 and I mod y=0 thenlcm=IExit ForEnd Ifnext IEnd Function(8)判断最大数、最小数Private Sub value(a() as integer, max as integer,min as integer)dim i as integermax=a(1) : min=a(1)for i=2 to ubound(a)if a(i)>max then max=a(i)if a(i)<min then min=a(i)next iEnd Sub(9)阶乘方法一: 方法二:利用递归方式private Function Fact(byval N as integer) as Long private Function fact(n as integer) as longFact=1 if n=1 or n=0 thendo while N>0 fact=1fact=fact*N elseN=n-1 fact=n*fact(n-1) loop end ifEnd Function End Function(10)裴波拉挈数列(递推算法)Fab(n)=fab(n-1)+fab(n-2)private Function Fab(n as integer) as integerif n=1 or n=2 thenfab=1elseFab=Fab(n-1)+fab(n-2) ‘函数名=表达式End ifEnd Function(11)排序—从小到大方法一:使用选择排序法private sub sort(a() as integer)dim I as integer, j as integerdim n as integer, t as integern=Ubond(a)for i=1 to n-1for j=i+1 to nif a(i)>a(j) thent=a(i) : a(i)=a(j): a(j)=tend ifnext jnext iEnd Sub方法二:冒泡排序法private sub sort2(a() as integer)dim I as integer,j as integerdim n as integer, t as integern=ubound(a)for i=1 to n-1for j=1 to n-iif a(j)>a(j+1) thent=a(j): a(j)=a(j+1): a(j+1)=tEnd IfNext jNext IEnd Sub(12)分解质因子:如:120=2*2*2*3*5private sub zhiyinzi(n as integer, a() as integer)dim k as integer, i as integeri=2doif n mod i=0 thenk=k+1 : Redim Preserve a(k) : a(k)=i: n=n\i elsei=i+1End Ifloop until n=1End Sub(13)各位数分离Private Sub command1_click() dim i as integer,j as integer i=inputbox("请输入数值") do while i<>0j=i mod 10print ji=i\10loopEnd Sub。
VB常用算法介绍
VB常用算法介绍在VB程序开发中,常常需要使用各种算法来处理数据和解决问题。
下面将介绍几种常用的VB算法,包括排序算法、算法和图算法等。
1.排序算法排序算法用来将一组数据按照一定的规则进行排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序等。
冒泡排序(Bubble Sort)是一种交换排序算法,通过不断地相邻元素比较和交换,将较大的元素逐渐交换到末尾,从而实现排序。
冒泡排序的时间复杂度为O(n^2)。
选择排序(Selection Sort)是一种排序算法,每次从待排序的数据元素中选择最小(或最大)的一个元素,放到已排序的序列的末尾。
选择排序的时间复杂度为O(n^2)。
插入排序(Insertion Sort)是一种排序算法,将数组元素分为已排序和未排序两部分,每次从未排序的部分中取出一个元素,插入到已排序的部分的适当位置。
插入排序的时间复杂度为O(n^2)。
归并排序(Merge Sort)是一种分治排序算法,将待排序的数据分为两个子序列,然后递归地对子序列进行排序,并将两个已排序的子序列合并成一个有序序列。
归并排序的时间复杂度为O(nlogn)。
快速排序(Quick Sort)是一种分治排序算法,通过一次划分将待排数据分成左右两个子序列,然后递归地对子序列进行排序。
快速排序的时间复杂度为O(nlogn)。
2.算法算法用来在一个数据集合中查找一些元素或满足特定条件的元素。
常见的算法包括线性、二分和深度优先。
线性(Linear Search)是一种简单的算法,从数据集合的第一个元素开始逐个比较,直到找到目标元素或遍历完整个集合。
线性的时间复杂度为O(n)。
二分(Binary Search)是一种在有序数据集合中查找目标元素的算法,通过每次将范围缩小一半来快速定位目标元素。
二分的时间复杂度为O(logn)。
深度优先(Depth-First Search,DFS)是一种用来在图或树结构中遍历所有节点的算法,从一个起始节点开始,先遍历一个邻接节点,然后再递归地遍历该邻接节点的邻接节点。
vb常用算法
1、主次对角线求和(可以写成过程的形式)Private Function SumMain(a() as integer) For i = 1 To Ubound(a,1)s = s + a(i, i)Next isumMain=sEnd FunctionPrivate Function SumFu(a() as integer) For i = 1 To Ubound(a,1)s = s + a(i, Ubound(a,1) + 1 - i)Next isumFu=sEnd Sub2、斐波那锲数列(后一项为前面两项之和) Private sub Fib(n as Integer)Dim a() as Integera(1) = 1: a(2) = 1redim preserve a(n)For i = 3 To na(i) = a(i - 1) + a(i - 2)redim preserve a(i)Next iEnd Sub3、冒泡法排序Private Sub Sort(a() as Integer)For i = 1 To Ubound(a) - 1For j = i + 1 To Ubound(a)If A(i) > A(j) Then '''判断a(i)与a(j+1)谁大,把大的放到前边t = A(i)A(i) = A(j)A(j) = tEnd IfNext jNext i''如果要从小到大排就把"A(j) > A(j - 1)"改称"A(j) < A(j - 1)" End Sub4、求和和周边元素的和Private Function Sum(a() as Integer)as integerFor i = 1 To Ubound(a,1)For j = 1 To Ubound(a,2)s = s + a(i, j)Next jNext iSum=sEnd FunctionPrivate Function ZhouBianSum(a() as Integer)as Integer For j = 1 To Ubound(a,1)s = s + a(1, j) + a(3, j)Next jFor i = Lbound(a,1) + 1 To 3 – Lbound(a,1)s = s + a(i, 1) + a(i, 3)Next iZhouBianSum=sEnd Function5、删除一项Private Sub Del(a() as Integer, n as Integer )For i = n To 9a(i) = a(i + 1)Next iEnd Sub6、选择法排序Private Sub ChoicePX(a() as Integer )For i = 1 To Ubound(a)-1k = iFor j = i + 1 To Ubound(a)If a(k) > a(j) Thenk = jEnd IfNext jIf k <> i Thentemp = a(i)a(i) = a(k)a(k) = tempEnd IfNext iEnd Sub7、增加一项Private Sub Add(a() as Integer ,n as Integer) For i = 10 To n Step -1a(i + 1) = a(i)Next ia(n) = mEnd Sub8、转置数列Dim a(3, 4) As Integer, b(4, 3) As Integer Private Sub ZhuanZhi()For i = 1 To 4For j = 1 To 3b(i, j) = a(j, i)Next jNext iEnd Sub9、最小公倍数Private Function GongBeishu(m As Integer, n As Integer) As Integer If n <> 0 And m <> 0 Thenk = nDo While k Mod m <> 0k = k + nLoopEnd IfGongBeishu = kEnd Function10、十六进制转化为十进制Private Function ST(strz As String) As StringFor i = Len(strz) To 1 Step -1strg = Mid(strz, i, 1)If Asc(strg) >= 65 And Asc(strg) <= 70 Thena = Asc(strg) - 55ElseIf Asc(strg) >= 97 Thena = Asc(strg) - 87Elsea = strgEnd Ifs = s + a * 16 ^ (Len(strz) - i) Next iST = sEnd Function。
vb程序设计常用算法
Exit For '结束循环
End if
End if
a(imin) = temp
Next I
2.冒泡法排序(升序)
基本思想:(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次
两两相邻比较后,最大的数已"沉底",放在最后一个位置,小数上升"浮起";
2)第二趟对余下的n-1个数(最大的数已"沉底")按上法比较,经n-2次两两相邻比较后得
,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
m =val( InputBox("请输入一个数"))
For i=2 To int(sqr(m))
If m Mod i = 0 Then Exit For
Next i
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
Next n1
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
VB常用算法总结大全
VB常用算法总结大全VB(Visual Basic)是一种对初学者友好的编程语言,因其简单易学的特点而受到很多人的喜爱。
在VB中,算法是编程过程中非常重要的一部分,它们用来解决各种问题,从简单的数学计算到复杂的数据处理。
本文将总结一些常用的算法,帮助VB程序员更好地应用于实际项目中。
一、排序算法1.冒泡排序冒泡排序是一种简单的排序算法,它通过不断地交换相邻的元素来对数据进行排序。
它的基本思想是从列表的第一个元素开始,依次比较相邻的两个元素,如果顺序不正确,则交换它们的位置。
重复这个过程,直到整个列表都已经排序。
2.快速排序快速排序是一种高效的排序算法,它通过选择一个基准元素,将列表分为两部分,一部分小于基准元素,一部分大于基准元素。
然后对这两部分分别进行快速排序,最后将它们合并在一起。
3.插入排序插入排序是一种简单直观的排序算法,它将列表分为已排序和未排序两部分,每次选择未排序部分的第一个元素,并插入到已排序部分的适当位置。
重复这个过程,直到整个列表都已经排序。
二、查找算法1.顺序查找顺序查找是一种简单的查找算法,它从列表的第一个元素开始,依次比较每个元素,直到找到目标元素或者遍历完整个列表。
2.二分查找二分查找是一种高效的查找算法,它要求列表已经排序。
它通过比较目标元素与列表中间元素的大小关系来确定要的部分,并缩小范围。
重复这个过程,直到找到目标元素或者确定列表中没有目标元素。
三、图算法1.深度优先(DFS)深度优先是一种用于图遍历的算法,它从一个起始点开始,沿着一个路径尽可能深地访问节点,直到遇到一个没有未访问过的相邻节点为止。
然后回溯到前一个节点,寻找其他路径。
2.广度优先(BFS)广度优先也是一种用于图遍历的算法,它从一个起始点开始,依次访问所有与起始点相邻的节点,然后再依次访问这些节点的相邻节点,直到遍历完图中的所有节点。
四、动态规划动态规划是一种解决多阶段决策问题的方法,它将问题分解为若干个阶段,并定义状态和决策。
VB常用算法总结
VB常用算法总结在VB(Visual Basic)编程中,常用的算法有很多。
下面将对其中一些常见和重要的算法进行总结。
请注意,由于篇幅限制,这只是一个简要总结,无法涵盖所有算法的细节。
1.排序算法:排序算法是计算机科学中最基本和常见的算法之一、在VB中,常用的排序算法包括冒泡排序、插入排序、选择排序、快速排序和归并排序等。
排序算法通过比较和交换来对一组数据进行重新排列,使其按照指定的顺序排列。
2.查找算法:查找算法用于在一个数据集中寻找特定的值或元素。
在VB中,常用的查找算法有二分查找和线性查找等。
二分查找是一种高效的算法,可以在有序数组中快速地找到目标元素。
3.图算法:图算法是用于解决与图相关的问题的算法。
在VB中,常用的图算法包括广度优先(BFS)和深度优先(DFS)等。
这些算法可以用于寻找图中的路径、检测环和遍历图等操作。
4.动态规划:动态规划是一种用于解决最优化问题的算法。
在VB中,常用的动态规划算法有背包问题、最长公共子序列和最短路径等。
动态规划算法通过拆解问题为子问题,并保存子问题的解来避免重复计算,从而提高算法的效率。
5.字符串匹配:字符串匹配算法用于在一个字符串中查找另一个字符串。
在VB中,常用的字符串匹配算法有暴力匹配算法、KMP算法和Boyer-Moore算法等。
这些算法通过比较字符来确定字符串的匹配位置。
6.线性代数:线性代数是数学的一个分支,用于解决线性方程组和向量空间等问题。
在VB中,常用的线性代数算法有矩阵运算、向量运算和线性方程求解等。
这些算法可以应用于计算机图形学、数据分析和机器学习等领域。
7.数学运算:数学运算在VB编程中非常常见。
常用的数学运算算法包括求和、平均值、最大值、最小值和中值等。
这些算法可以通过循环和条件判断来实现。
8.加密与解密:加密和解密算法用于保护数据的安全性。
在VB中,常用的加密算法有对称加密算法(如DES和AES)和非对称加密算法(如RSA和ECC)等。
VB常用算法大全
VB常用算法大全在VB中实现常用算法是程序开发中非常常见的任务之一、下面将介绍几个常用的算法以及它们在VB中的实现方式。
1.冒泡排序算法:冒泡排序是一种简单直观的排序算法,它通过交换相邻元素来排序。
具体实现如下:```vbSub BubbleSort(arr( As Integer)Dim i As Integer, j As IntegerDim temp As IntegerFor i = LBound(arr) To UBound(arr) - 1For j = i + 1 To UBound(arr)If arr(j) < arr(i) Thentemp = arr(j)arr(j) = arr(i)arr(i) = tempEnd IfNext jNext iEnd Sub```2.快速排序算法:快速排序是一种高效的排序算法,它通过选择一个基准元素并将数组分为两部分来排序。
具体实现如下:```vbSub QuickSort(arr( As Integer, low As Integer, high As Integer)Dim i As Integer, j As IntegerDim pivot As Integer, temp As Integeri = lowj = highpivot = arr((low + high) / 2)While i <= jWhile arr(i) < pivoti=i+1WendWhile arr(j) > pivotj=j-1WendIf i <= j Thentemp = arr(i)arr(i) = arr(j)arr(j) = tempi=i+1j=j-1End IfWendIf low < j Then QuickSort arr, low, j End IfIf i < high Then QuickSort arr, i, high End IfEnd Sub```3.查找算法之二分查找:二分查找算法是一种在有序数组中查找指定元素的算法。
VB常用算法总结
VB常用算法总结VB是一种基于Visual Basic语言的编程语言,广泛应用于Windows 操作系统环境下的软件开发。
在VB中,算法的选择和使用对于解决问题是至关重要的。
本文将对VB常用算法进行总结,希望能给读者提供一些编程的指导和参考。
一、排序算法排序算法是一类重要的算法,用于将一组无序的数据按照一定的规则进行排序。
VB中常用的排序算法有冒泡排序、选择排序、插入排序、快速排序等。
1.冒泡排序:从序列的第一个元素开始,依次比较相邻的两个元素,如果它们的顺序错误则交换位置,直到序列被完全排序。
2.选择排序:依次选择未排序序列中的最小元素,将其放到已排序序列的末尾。
3.插入排序:将一个记录插入到已排序好的序列中,从而得到一个新的、记录数增1的有序序列。
4.快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,然后分别对这两部分记录继续进行排序,直到整个序列有序。
二、查找算法查找算法用于在一组有序或无序的数据中寻找指定的元素。
VB中常用的查找算法有线性查找、二分查找、哈希查找等。
1.线性查找:从数据的开头开始,逐个比较每一个元素,直到找到目标元素。
2.二分查找:在有序序列中,每次将待查元素与中间位置的元素比较,如果相等则找到,否则将待查元素与中间位置的元素比较,直到找到目标元素或序列为空。
3.哈希查找:通过哈希函数将关键字映射到一个定长的数组上,当需要查找时,根据关键字计算出哈希地址,从数组中访问对应位置的元素。
三、图算法图算法主要用于解决图结构相关的问题,如最短路径、拓扑排序等。
VB中常用的图算法有深度优先、广度优先、Dijkstra算法等。
1.深度优先:从起始节点开始,递归地访问子节点,直到无法继续访问为止,然后回溯到上一级节点,继续访问其尚未被访问的子节点。
2.广度优先:从起始节点开始,依次访问其所有相邻节点,直到访问到目标节点为止。
3. Dijkstra算法:求解带权有向图中单源最短路径问题,通过使用一个优先队列来实现。
(完整版)vb常用算法介绍
一、累加算法如果在设计过程中遇到求1+2+3+……+100等连加问题时,就可以用累加算法来解决。
累加算法的一般做法是设一个变量 s,作为累加器使用,初值为0,设一个变量用来保存加数。
一般在累加算法中的加数都是有规律可循,可结合循环程序来实现. 一个循环程序的设计,如果以下三方面确定下来:变量的赋初值、循环体的内容、循环结束条件,那么根据循环语句的格式,就很容易写出相应的循环程序。
例:求1+2+3++100的累加和,并打印输出分析:设累加器S,初值为0,加数用变量I表示当I=1时,累加器S= S+I = 0+1=1当I=2时,累加器S= S+I =1+2= 3当I=3时,累加器S=S+I =3+3 =6当I=4时,累加器S=S+I =6+4 =10……当I=100时,累加器S=S+100=1+2+3+……+99+100=5050不难看出,I的值从1变化到100的过程中,累加器均执行同一个操作:S=S+I,S=S+I的操作执行了100次,所以该程序段可写成:Dim I As Integer, S As IntegerS = 0 ‘给累加器s赋初值For S = 1 To 100S= S + I ‘I既作为循环变量,又作为加数Next IPrint "1+2+……100=”; S考虑一下:语句Print ”1+2+……100=”; S可以放在循环体中吗?延伸一下:上述算法对数值型数据,执行的是累加操作,如果对字符串型数据,完成的是字符串的连接.例:从键盘上输入一串字符,要求将其加密后显示在文本框Text1中,加密的方法是将每一个字符转变为它的后一位字符,如:A转变为B,1转变为2。
分析:因为涉及对每一个字符做相应处理再连接成一个新串,所以可以用类似累加的算法。
定义一个变量str1用来接收输入的原始字符串,变量str2用来接收加密后的字符串,初值为空串。
可用Len()函数得出字符串的长度,用循环控制,从左向右逐个取字符,截取字符的功能可用函数Mid()完成,由于要做加密操作,可利用Asc()函数获得字符的Ascii码,用Chr()函数获得Ascii码对应的字符。
VB_常用算法总结
VB_常用算法总结VB是一种使用广泛的编程语言,它有很多常用的算法可以应用到各种实际的问题中。
下面是一些常用的VB算法的总结。
1.排序算法:-冒泡排序:比较相邻的两个元素,如果顺序错误则交换位置,重复该过程直到排序完成。
-插入排序:将一个元素插入到已经排好序的数组中的正确位置。
-选择排序:每次选择数组中最小的元素,放到已排序部分的末尾。
-快速排序:选择一个元素作为基准,将小于它的元素放在它的左边,大于它的元素放在右边,分别对左右两部分进行递归排序。
2.查找算法:-二分查找:将有序数组从中间切分,判断目标元素与中间元素的大小关系,递归查找目标元素所在的半边数组。
-线性查找:逐个比较数组中的元素,直到找到目标元素或遍历完整个数组。
3.图算法:-深度优先(DFS):从起始节点开始,递归地探索图中的每个节点,直到遍历到最深的节点为止。
-广度优先(BFS):从起始节点开始,逐层地探索图中的节点,直到找到目标节点。
- 最短路径(Dijkstra算法):计算从起始节点到所有其他节点的最短路径。
4.动态规划:-背包问题:给定一组物品和一个背包的容量,选择一些物品放入背包中,使得物品的总价值最大。
-最长公共子序列(LCS):两个序列中的最长公共子序列,可以用动态规划的方法求解。
5.图像处理:-图像平滑:使用滤波器(如均值滤波器、高斯滤波器)对图像进行平滑处理,去除图像中的噪声。
- 边缘检测:使用边缘检测算法(如Canny算法、Sobel算法)从图像中检测出物体的边缘。
6.数据压缩:-霍夫曼编码:根据字符出现的频率,构建霍夫曼树,并生成每个字符的编码,实现数据的无损压缩。
- Run-length编码:对连续出现的相同字符进行计数,并将计数值和字符编码压缩存储。
7.数学计算:-求解方程:使用牛顿迭代法、二分法等方法,寻找方程的根。
-矩阵操作:实现矩阵的相加、相乘、转置等操作。
以上只是VB中的一部分常用算法,还有很多其他的算法可以应用到实际问题中。
VB常考算法
常考算法:1.求因子数Private sub factor( x as integer, fn() as integer)Dim i as integer,n as integerRedim fn(1) : n=1 : fn(1)=1For i=2 to x/2If x mod i=0 thenN=n+1Redim preserve fn(n)Fn(n)=iEnd ifNext iEnd sub2.求因子数之和Private functionsum_ factor( n as integer) as long Dim i as intger,j as integer,s as integerDo while i<n/2I=i+1If n mod i=0 thenS=s+iEnd ifLoopSum_factor=sEnd function3.判断数是否为素数Private function prime(n as long) as booleanDim i as integerFor i=2 to sqr(n)If n mod i=0 then exit functionNext iPrime = trueEnd function4.求最大公约数Private function gcd(m as integer,n as integer) as integer If (m mod n)=0 thenGcd=nElseGcd=gcd(n,m mod n)End if5.求最小公倍数Private function lcm(a as integer,b as integer) as long DoLcm=lcm+aIf lcm mod a=0 and lcm mod b=0 thenExit doEnd ifloopEnd function6.求阶乘Private function fact (n as integer) as longIf n<=1 thenFact=1ElseFact=n * fact(n-1)End ifEnd function7.求分数约数Private sub divisor (fz as long,fm as long)Dim min as integer, k as integerIf fm<fz then min=fz else min=fmFor k=2 to minDo while fz mod k=0 and fm mod k=0Fz=fz/kFm=fm/kLoopNext kEnd sub8.一维数组排序(1).选择法排序,结果是从小到大Private sub choose(a() as integer)Dim i as integer, j as integer, temp as integerFor i=1 to ubound(a)-1For j=i+1 to ubound(a)If a(i)>a(j) thenTemp=a(i)A(i)=a(j)A(j)=tempEnd ifNext iEnd sub(2).冒泡法排序,结果是从小到大Private sub bubble_up(a() as integer)Dim i as integer, j as integer,Dim temp as doubleDim m as integerFor i=lbound(a) to ubound(a)-1For ubound(a) to i+1 step-1If a(j)>a(j-1) thenTemp=a(j)A(j)=a(j-1)A(j-1)=tempEnd ifNext jNext iEnd sub注:把程序中“>”改为“<”,排序的结果为从大到小。
(完整版)VB常用算法——排序
VB 常考算法(八)排序:1、算法 1)选择法排序算法说明:根据上例中求最小值的思路, 一轮,以第一个元素逐个跟后面的所有元素比较, 轮比较,第一个元素被确定为最小;同样的方法,下一轮以第二个元素跟剩下的所有元素进 行比较确定下次小的元素;以此类推…下面我们以图形的形式体现对第一轮:第二轮:素参与跟2号元素的比较,共 3次,以次类推,比较次数逐步减少。
经过四轮的比较,利用 逐步求最小值的方法将 5个数从小到大排好序。
对于这样一个排序的过程, 我们可以使用两 个循环分别控制比较的轮数和每一轮的次数。
程序代码:Private Sub Comma nd1_Click() Dim n As In teger n = In putBox(" 请输入数组元素的个数:")Dim a() As In teger, i As In teger, j As In tegerPrint "排序前:”我们可以使用如下方法进行从小到大排序:第 如果比后面的元素大就进行交换,经过一16 4 2 5最小值次小值5个数进行选择排序的过程:第三轮:ReDim a(n)For i = 1 To na(i) = In t(R nd * (99 -10 + 1) + 10) Print a(i);Next iFor i = 1 To n - 1 For j = i To nIf a(i) > a(j) Then temp = a(i)' a(i) = a(j) a(j) = temp End If Next j Next i PrintPrint " 排序后:" For i = 1 To n Print a(i); Next i End Sub2)冒泡法排序算法说明:相邻的元素进行比较,如果前面的元素比后面的元素大,则将它们进行交换,具体思路:设在数组 a 中存放n 个元素,第一轮,将 a(1)和a(2)进行比较,若a(1)>a(2), 则交换这两个元素的值,然后继续用a(2)和a(3)比较,若a(1)>a(2),则交换这两个元素的值,以此类推,直到a(n-1)和a(n)进行比较处理后,a(n)中就存放了 n 个数中最大的值; 第二轮,用a(1)与a(2),a(2) 与a(3),…,a(n-2)与a(n-1)进行比较,处理方法相同,这一 轮下来,a(n-1)中存放n 个数中第二大的值;…;第 n-1轮,a(1)与a(2)进行比较处理,确保最小值在a(1)中。
VB常用算法总结大全
时间复杂度:最好情况下为O(nlogn),最坏情况 下为O(n^2),平均情况下为O(nlogn)。
稳定性:不稳定。
02 查找算法
顺序查找
原理
01
从数据结构的一端开始,顺序扫描,直到找到所查元素为止。
时间复杂度
02
平均时间复杂度和最坏时间复杂度都是O(n),其中n是数据结构
中元素的个数。
适用场景
队列操作
实现入队(enqueue)、出队(dequeue)、 查看队首和队尾元素等基本操作。
3
应用举例
使用栈实现括号匹配检查、表达式求值等;使用 队列实现广度优先搜索(BFS)等算法。
06 文件操作与I/O流处理 算法
文件读写操作
顺序文件读写
使用Open、Input、Output、 Close等语句,按照文件内容的顺 序进行读写操作。
矩阵运算
矩阵加法
将两个矩阵对应元素相加得到新的矩阵。
矩阵乘法
按照矩阵乘法的规则,将两个矩阵相乘得到新的矩阵。
矩阵转置
将矩阵的行和列互换得到新的矩阵。
矩阵求逆
对于可逆矩阵,求解其逆矩阵。
线性方程组求解
高斯消元法
通过消元将线性方程组化为上三角或下三角形式,然后回代求解 。
LU分解法
将系数矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积,然 后分别求解。
链表创建
链表遍历
通过动态分配内存空间,创建链表节点并 连接起来形成链表。
从头节点开始,依次访问链表中的每个节 点。
链表插入
在链表的指定位置插入一个新的节点。
链表删除
删除链表中的指定节点或一系列节点。
栈和队列操作及应用举例
1 2
VB编程用经常要要用到的算法
vb算法:VB编程用经常要要用到的算法(经典)算法(Algorithm):计算机解题基本思想思路方法和步骤算法描述:是对要解决个问题或要完成项任务所采取思路方法和步骤描述包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等通常使用自然语言、结构化流程图、伪代码等来描述算法1、计数、求和、求阶乘等简单算法此类问题都要使用循环要注意根据问题确定循环变量初值、终值或结束条件更要注意用来表示计数、和、阶乘变量初值例:用随机产生100个[099]范围内随机整数统计个位上数字分别为1234567890数个数并打印出来本题使用来处理用a(1 to 100)存放产生确100个随机整数x(1 to 10)来存放个位上数字分别为1234567890数个数即个位是1个数存放在x(1)中个位是2个数存放在x(2)中……个位是0个数存放在x(10)将编写在个GetTJput过程中代码如下:Public Sub GetTJputDim a(1 To 100) As IntegerDim x(1 To 10) As IntegerDim i As Integer, p As Integer\'产生100个[099]范围内随机整数每行10个打印出来For i = 1 To 100a(i) = Int(Rnd * 100)If a(i) < 10 ThenForm1.Pr Space(2); a(i);ElseForm1.Pr Space(1); a(i);End IfIf i Mod 10 = 0 Then Form1.PrNext i\'统计个位上数字分别为1234567890数个数并将统计结果保存在x(1),x(2),...,x(10)中将统计结果打印出来For i = 1 To 100p = a(i) Mod 10 \' 求个位上数字If p = 0 Then p = 10x(p) = x(p) + 1Next iForm1.Pr \"统计结果\" For i = 1 To 10p = iIf i = 10 Then p = 0Form1.Pr \"个位数为\" + Str(p) + \"共\" + Str(x(i)) + \"个\"Next iEnd Sub2、求两个整数最大公约数、最小公倍数[Page]分析:求最大公约数算法思想:(最小公倍数=两个整数的积/最大公约数)(1) 对于已知两数mn使得m>n;(2) m除以n得余数r;(3) 若r=0则n为求得最大公约数算法结束;否则执行(4);(4) m←nn←r再重复执行(2)例如: 求m=14 ,n=6 最大公约数. m n r14 6 26 2 0m=inputBox(\"m=\")n=inputBox(\"n=\")nm=n*mIf m < n Then t = m: m = n: n = tr=m mod nDo While (r <> 0)m=nn=rr= m mod nLoopPr \"最大公约数=\", nPr \"最小公倍数=\", nm/n3、判断素数只能被1或本身整除数称为素数基本思想:把m作为被除数将2—INT()作为除数如果都除不尽m就是素数否则就不是(可用以下段实现)m =val( InputBox(\"请输入个数\"))For i=2 To (sqr(m))If m Mod i = 0 Then Exit ForNext iIf i > (sqr(m)) ThenPr \"该数是素数\"Else[Page]Pr \"该数不是素数\"End If将其写成,若为素数返回True不是则返回FalsePrivate Function Prime( m as Integer) As BooleanDim i%Prime=TrueFor i=2 To (sqr(m))If m Mod i = 0 Then Prime=False: Exit ForNext iEnd Function4、验证哥德巴赫猜想(任意个大于等于6偶数都可以分解为两个素数的和)基本思想:n为大于等于6任偶数可分解为n1和n2两个数分别检查n1和n2是否为素数如都是则为组解如n1不是素数就不必再检查n2是否素数先从n1=3开始检验n1和n2(n2=N-n1)是否素数然后使n1+2 再检验n1、n2是否素数…直到n1=n/2为止利用上面prime验证哥德巴赫猜想代码如下:Dim n%,n1%,n2%n=Val(InputBox(\"输入大于6正整数\"))For n1=3 to n step 2n2=n-n1If prime(n1) ThenIf prime(n2) thenPr n & \"=\" & n1 & \"+\" & n2Exit For \'结束循环EndEnd [Page]Next n15、排序问题1.选择法排序(升序)基本思想:1)对有n个数序列(存放在a(n)中)从中选出最小数和第1个数交换位置;2)除第1 个数外其余n-1个数中选最小数和第2个数交换位置;3)依次类推选择了n-1次后这个数列已按升序排列代码如下:For i = 1 To n - 1imin = iFor j = i + 1 To nIf a(imin) > a(j) Then imin = jNext jtemp = a(i)a(i) = a(imin)a(imin) = tempNext I2.冒泡法排序(升序)基本思想:(将相邻两个数比较小调到前头)1)有n个数(存放在a(n)中)第趟将每相邻两个数比较小调到前头经n-1次两两相邻比较后最大数已“沉底”放在最后个位置小数上升“浮起”;2)第2趟对余下n-1个数(最大数已“沉底”)按上法比较经n-2次两两相邻比较后得次大数;3)依次类推n个数共进行n-1趟比较在第j趟中要进行n-j次两两比较段如下For i = 1 To n - 1For j = 1 To n-iIf a(j) > a(j+1) Thentemp=a(j): a(j)=a(j+1): a(j+1)=tempEndNext jNext i3.合并法排序(将两个有序A、B合并成另个有序C升序) 基本思想:1)先在A、B中各取第个元素进行比较将小元素放入C;2)取小元素所在下个元素和另中上次比较后较大元素比较重复上述比较过程直到某个被先排完;3)将另个剩余元素抄入C合并排序完成段如下:Do While ia <= UBound(A) And ib <= UBound(B) \'当A和B均未比较完If A(ia) < B(ib) ThenC(ic) = A(ia): ia = ia + 1ElseC(ic) = B(ib): ib = ib + 1End Ific = ic + 1[Page]LoopDo While ia <= UBound(A) \'A中剩余元素抄入CC(ic) = A(ia)ia = ia + 1: ic = ic + 1LoopDo While ib <= UBound(B) \'B中剩余元素抄入CC(ic) = B(ib)ib = ib + 1: ic = ic + 1Loop6、查找问题1.①顺序查找法(在列数中查找某数x)基本思想:列数放在a(1)---a(n)中待查找数放在x 中把x和a中元素从头到尾进行比较查找用变量p表示a元素下标p初值为1使x和a(p)比较如果x不等于a(p)则使p=p+1不断重复这个过程;旦x等于a(p)则退出循环;另外如果p大于长度循环也应该停止(这个过程可由下语句实现)p = 1Do While x <> a(p) And p < =np = p + 1Loop下面写查找Find若找到则返回下标值找不到返回0Option Base 1 Private Function Find( a( ) As Single,x As Single) As IntegerDim n%,p%n=Ubound( a )p = 1Do While x <> a(p) And p < =np = p + 1LoopIf p>n then p=0Find=pEnd Function②基本思想:列数放在a(1)---a(n)中待查找关键值为key把key和a中元素从头到尾进行比较查找若相同查找成功若找不到则查找失败(查找子过程如下index:存放找到元素下标)Public Sub Search(a As Variant, key As Variant, index%)Dim i%For i = LBound(a) To UBound(a)If key = a(i) Thenindex = iExit SubEnd IfNext iindex = -1End Sub2.折半查找法(只能对有序数列进行查找)基本思想:设n个有序数(从小到大)存放在a(1)----a(n)中要查找数为x用变量bot、top、mid 分别表示查找数据范围底部(下界)、顶部(上界)和中间mid=(top+bot)/2折半查找算法如下:(1)x=a(mid)则已找到退出循环否则进行下面判断;(2)x<a(mid)x必定落在bot和mid-1范围的内即top=mid-1;(3)x>a(mid)x必定落在mid+1和top范围的内即bot=mid+1;(4)在确定了新查找范围后重复进行以上比较直到找到或者bot<=top[Page]将上面算法写成如下若找到则返回该数所在下标值没找到则返回-1Function search(a As Integer, x As Integer) As IntegerDim bot%, top%, mid%Dim find As Boolean \'代表是否找到bot = LBound(a) top = UBound(a)find = False \'判断是否找到逻辑变量初值为FalseDo While bot <= top And Not findmid = (top + bot) 2If x = a(mid) Thenfind = TrueExit DoElseIf x < a(mid) Thentop = mid - 1Elsebot = mid + 1End IfLoopIf find Thensearch = midElsesearch = -1End IfEnd Function7、插入法把个数插到有序数列中插入后数列仍然有序基本思想:n个有序数(从小到大)存放在a(1)—a(n)中要插入数x首先确定x插在中位置P;(可由以下语句实现)p=1do while x>a(p) and p<=np=p+1loopa(p)—a(n)元素向后顺移个位置以空出a(p)元素放入x可由以下语句实现:for i=n to p step-1a(i+1)=a(i)next ia(p)=x将其写成插入Private Sub Instert(a As Single, x As Single)Dim p%, n%, i%n = UBound(a)ReDim Preserve a(n + 1)p = 0Do While x > a(p) And p < =n \' 确定x应插入位置p = p + 1[Page]LoopFor i = n To p Step -1a(i + 1) = a(i)Next ia(p) = xEnd Sub8、矩阵( 2维)运算(1)矩阵加、减运算C(i,j)=a(i,j)+b(i,j) 加法C(i,j)=a(i,j)-b(i,j) 减法(2)矩阵相乘(矩阵A有M*L个元素矩阵B有L*N个元素则矩阵C=A*B有M*N个元素)矩阵C中任元素(i=1,2,…,m;j=1,2,…,n)For i = 0 To mFor j = 0 To nc(i, j) = 0For k = 0 To lc(i, j) = c(i, j) + a(i, k) * b(k, j)Next kNext jNext i [Page](3)矩阵传置例:有2维a(5,5)要对它实现转置可用下面两种方式:For i=1 to 5 (2) For i=2 to 5For j=i+1 to 5 For j=1 to i t=a(i,j) t=a(i,j)a(i,j)= a(j,i) a(i,j)= a(j,i)a(j,i)=t a(j,i)=tNext j Next jNext i Next i(4)求2维中最小元素及其所在行和列基本思路同维可用下面段实现(以2维a(2,3)为例):‘变量max中存放最大值row,column存放最大值所在行列号Max = a(1, 1): row = 1: Column = 1For i = 1 To 2For j = 1 To 3If a(i, j) > a(row, Column) ThenMax = a(i, j)row = iColumn = jEnd IfNext jNext iPr \"最大元素是\"; MaxPr \"在第\" & row & \"行,\"; \"第\" & Column & \"列\"9、迭代法算法思想:[Page]对于个问题求解x可由给定个初值x0根据某迭代公式得到个新值x1这个新值x1比初值x0更接近要求值x;再以新值作为初值即:x1→x0,重新按原来思路方法求x1,重复这过和直到|x1-x0|<ε(某给定精度)此时可将x1作为问题解例:用迭代法求某个数平方根已知求平方根迭代公式为:Private Function Fsqrt( a As single ) AS singleDim x0 As Single, x1 As Singlex0 =a/2 \'迭代初值x1 = 0.5*(x0 + a/x0)Dox0 = x1 \'为下次迭代作准备x1 = 0.5*(x0 + a/x0)Loop While Abs(x1 - x0) > 0.00001 Fsqrt=x1End Function十、数制转换将个十进制整数m转换成→r(2-16)进制串思路方法:将m不断除r 取余数直到商为零以反序得到结果下面写出转换参数idec为十进制数ibase为要转换成数基(如2进制基是2 8进制基是8等)输出结果是串Private Function TrDec(idec As Integer, ibase As Integer) As StringDim strDecR$, iDecR%strDecR = \"\"Do While idec <> 0iDecR = idec Mod ibaseIf iDecR >= 10 ThenstrDecR = Chr$(65 + iDecR - 10) & strDecRElsestrDecR = iDecR & strDecREnd Ifidec = idec ibaseLoopTrDec = strDecREnd Function十、串般处理1.简单加密和解密加密思想是:将每个字母C加(或减)序数K即用它后第K个字母代替变换式公式: c=chr(Asc(c)+k)例如序数k为5这时\"A\"→\"F\" \"a\"→?\"f\"\"B\"→?\"G\"…当加序数后字母超过\"Z\"或\"z\"则c=Chr(Asc(c)+k -26)例如:You are good→Dtz fwj ltti解密为加密逆过程将每个字母C减(或加)序数K即c=chr(Asc(c)-k),例如序数k为5这时\"Z\"→\"U\" \"z\"→\"u\"\"Y\"→\"T\"…[Page]当加序数后字母小于\"A\"或\"a\"则c=Chr(Asc(c)-k +26)下段是加密处理:i = 1: strp = \"\"nL = Len(RTrim(strI)) Do While (i <= nL)strT = Mid$(strI, i, 1) \'取第i个If (strT >= \"A\" And strT <= \"Z\") TheniA = Asc(strT) + 5If iA > Asc(\"Z\") Then iA = iA - 26strp = strp + Chr$(iA)ElseIf (strT >= \"a\" And strT <= \"z\") TheniA = Asc(strT) + 5If iA > Asc(\"z\") Then iA = iA - 26strp = strp + Chr$(iA)Elsestrp = strp + strTEnd Ifi = i + 1LoopPr strp2.统计文本单词个数算法思路:(1)从文本(串)左边开始取出个;设逻辑量WT表示所取是否是单词内初值设为False(2)若所取不是“空格”“逗号”“分号”或“感叹号”等单词分隔符再判断WT是否为True 若WT不为True则表是新单词开始让单词数Nw=Nw+1让WT=True;(3)若所取是“空格”“逗号”“分号”或“感叹号”等单词分隔符则表示不是单词内让WT=False;(4) 再依次取下个重得(2)(3)直到文本结束下面段是串strI中包含单词数Nw = 0: Wt = FalsenL = Len(RTrim(strI))For i = 1 To nLstrT = Mid$(strI, i, 1) \'取第i个Select Case strTCase \" \", \",\", \";\", \"!\"Wt = FalseCase Else If Not Wt ThenNw = Nw + 1[Page]Wt = TrueEnd IfEnd SelectNext iPr \"单词数为:\", Nw十2、穷举法穷举法(又称“枚举法”)基本思想是:列举各种可能情况并判断哪种可能是符合要求解这是种“在没有其它办法情况思路方法”是种最“笨”思路方法然而对些无法用解析法求解问题往往能奏效通常采用循环来处理穷举问题例: 将张面值为100元人民币等值换成100张5元、1元和0.5元零钞要求每种零钞不少于1张问有哪几种组合?Dim i%, j%, k%Pr \"5元1元0.5元\"For i = 1 To 20For j = 1 To 100 - ik = 100 - i - jIf 5.0 * i + 1.0 * j + 0.5 * k = 100 ThenPr i, j, kEnd IfNext jNext i十3、递归算法用自身结构来描述自身称递归VB允许在个Sub子过程和Function过程定义内部自己即递归Sub子过程和递归Function递归处理般用栈来实现每次自身把当前参数压栈直到递归结束条件;然后从栈中弹出当前参数直到栈空递归条件:(1)递归结束条件及结束时值;(2)能用递归形式表示且递归向终止条件发展例:编fac(n)=n! 递归Function fac(n As Integer) As IntegerIf n = 1 Thenfac = 1 Elsefac = n * fac(n - 1)End IfEnd Function。
vb常用算法
VB常用算法算法1 交换2个变量的值算法思想:若交换两个变量的值,必须引入第三个新的变量进行传递。
交换a,b的值: t=a:a=b:b=t或者t=b:b=a:a=t算法2 产生随机数算法思想:生成一个[a,b]区间的整数公式为Int(Rnd*(b-a+1))+a1.自动生成[0,100]之间的随机数: Int(Rnd*101)2.自动生成2位随机整数: Int(Rnd*90+10)例:自动产生10个100~999之间的随机整数,并放到数组a中Dim a(10 ) as integerFor i=1 to 10a(i) =Int(Rnd*900)+100Next i算法3判断一个数是否能被另一个数整除算法思想:可以用整除的定义(余数为0)或X除以Y等于X整除Y等表达式进行判断。
条件表达式可以为:X mod Y=0或X\Y=X/Y或Int(X/Y)=X/Y如果以上条件表达式为True,则表示X能被Y整除。
例题:统计0—100之间能被3整除的数的个数、累加和及其平均值。
s=0n=0For i=0 To 100If i mod 3=0 Thens=s+in=n+1End IfNext iPrint n,s,s/n算法4 求阶乘和累加和算法思想:使用循环语句,并用一个变量存放累加的中间及最终结果。
注:(1)累加求和时变量初值为0。
(2)计算阶乘时变量初值为1。
(3)统计计个数(计数)时可用一个变量作为统计个数的累加变量,每次加1即可。
(4)求平均值算法思想是先求和,再除以个数。
(5)条件求和(或计数):在循环语句中加入If-End If判断语句。
1.求1 ~n个自然数的阶乘s=1For i=1 to ns=s*iNext i2.求1 ~n个自然数的累加和s=0For i=1 to ns=s+iNext i例题:计算1到10之间所有整数的累加和以及10!。
n=10sum= 0prod= 1For i=1 To 10sum=sum+ iprod=prod* iNext iPrint sum,prod例题:统计1—100之间能被3和7整除的数的个数、并求它们的累加和。
VB_常用算法
1.数据处理 (2)1.1冒泡法排序 (2)1.2选择法排序 (2)1.3顺序查找 (2)1.4折半查找 (3)1.5阶乖与规则数求和 (3)1.6最值与平均和素数 (4)1.7进制间转换 (5)2.字符处理 (5)2.1简单加密和解密 (5)2.2统计文本单词的个数 (6)2.3如果单词仅以空格作为分隔符: (6)2.4大写字符的统计 (7)2.5逐个字符处理 (7)3.图形处理 (7)3.1画出任意封闭曲线 (7)3.2画出任意封闭折线 (8)3.3根据条件画规则图形 (8)1.数据处理1.1冒泡法排序核心,挨着的两两比较For i = 1 To 10For j = 10 To i + 1 step -1If a(j) < a(j - 1) Thent = a(j): a(j) = a(j - 1): a(j - 1) = t //小数上沸END IfNext jPrint a(i);Next iN个数的For i = 1 To n - 1For j = 1 To n-iIf a(j) > a(j+1) Then //大数沉底temp=a(j)a(j)=a(j+1)a(j+1)=temp //大数沉底End ifNext jNext i1.2选择法排序核心,取第一个挨个的和后面的比较For i = 1 To n - 1p = iFor j = i + 1 To nIf a(p) > a(j) Then p = jNext jt = a(i)a(i) = a(p)a(p) = tNext i1.3顺序查找For p=1 to nIf x=x( p) Then exit forNext pIf p<=n thenprint “找到”,xelseprint “没找到”End if1.4折半查找find = False '判断是否找到的逻辑变量,初值为Falsetop = 1bot = n 'n 为数组下标的上界Do While top <= bot And Not findmid = (top + bot) / 2If x = a(mid) Thenfind = TruePrint "the position is "; midElseIf x < a(mid) Thenbot = mid - 1Elsetop = mid + 1End IfLoopIf (Not find) Then Print x; "has not found"1.5阶乖与规则数求和阶乖:Private Sub Command1_Click()Dim N, k, p, s As IntegerN = Val(Text1.Text)p = 1: s = 0For k = 1 To Np = p * ks = s + pNextLabel1.Caption = "1!+2!+...+" & N & "!=" & sEnd Sub 规则数据验证:2212121212134321=------nPrivate Sub Command1_Click()n = Val(Text1.Text)s = 3For k = 1 To nV = 2 ^ ks = s - 1 / VD = Abs(2 - s)Label1.Caption = DEnd Sub形如:1+21+321+4321+54321+。
VB常用十大算法
1. 累加与连乘1、算法说明[分析]累加形式:V=V+e 连乘形式:V=V*e其中:V 是变量,e 是递增表达式。
累加和连乘一般通过循环结构来实现。
注意:需在执行循环体前对变量 V 赋初值。
一般累加时置初值0;连乘时置初值为1 [举例]求N!的结果。
Private Sub Comma nd1_Click()Dim n%, i%, s&n = Val(InputBox("输入 n"))s = 1For i = 1 To ns = s * iNext iPr int sEnd Sub[应用举例]根据下列公式,求自然对数 e 的的近似值Private Sub Comma nd1_Click()Dim i%, n&, t!, e!e = 2i = 1t = 1Do While t > 0.00001i = i + 1t = t / i e = e + tLoopPrint"计算了 "; i;"项目和是:";ePrint Exp(1)与上句输出值进行对比以证明算法的正确性End Sub2. 最值问题1、算法说明=1 + 一_ + — +一 + 1! 2! 3! + 1 = 1 + -1要求:误差小于0.00001在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例:随机产生n个1-100 (包括1和100)的数,求它们的最大值、最小值和平均值。
Private Sub Comma nd1_Click()Dim n%, i%, min%, max%, aver!, s%n 二 Val(lnputBox("输入个数:"))s = Int (Rnd * 100) + 1max = s : min = s : aver = sPrint"第1个数是:” & sFor i = 2 To ns = In t(R nd * 100) + 1Print"第” & i & ” 个数是:” & sIf s > max The n max = sIf s < min The n min = saver = aver + sNext iaver = aver/nPrin t "max="; max; " min二";min; "aver二";averEnd Sub解题技巧:最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。
VB常用算法
1.求任意自然数n的阶乘:方法一Do循环法S=1FOR I=1 TO nS=S*INEXT I方法二For循环S=1:t=1DO WHILE t<=5S=S*tt= t +1LOOP2.闰年判断y = T ext1.T extIf (y Mod 4 = 0 And y Mod 100 <> 0) Or y Mod 400 = 0 Then MsgBox y & "是闰年"ElseMsgBox y & "不是闰年"End If3.求两个自然数m、n的最大公约数Hmax和最小公倍数Hmin m=T ext1.text : n=T ext2.text ‘m和n可通过其他途径赋值mn=m*n ‘暂存m和n的乘积,以便后面算最小公倍数If m<n Thent=m :m=n :n=tEnd Ifr=m Mod n Do While r< >0m=nn=rr=m Mod nLoopHmax=nHmin=mn/Hmax4. 素数判断N=InputBox( “输入>=3的正整数”)FOR I=2 TO N-1 ‘或SQR(N) ,提前退出法IF (N MOD I =0) THEN EXIT FORNEXT IIF I>N-1 THENPRINT N; “是素数”ELSEPRINT N; “不是素数”N=InputBox( “输入一个>=3的正整数”) END IFF=0 …F也可用逻辑型变量,标志法FOR I=2 TO N-1 ‘或SQR(N)IF (N MOD I =0) THEN F=1NEXT IIF F=0 THENPRINT N; “是素数”ELSEPRINT N; “不是素数”END IF6.单词数统计方法一标志法,以空格作为单词间的间隔(假设只有空格和字母)Dim a$, temp$Dim n%, i%Dim newWord As Boolean, WordNum As Integera = T ext1.T ext 'a = Ltrim(T ext1.T ext)n = Len(a)newWord = False '未遇到新单词(也可用数值变量)WordNum = 0For i = 1 T o ntemp = Mid(a, i, 1)If temp = " " ThennewWord = False'简化为ElseIf newWord = False ThenElseIf UCase(temp) >= "A" And UCase(temp) <= "Z" And newWord = False ThenWordNum = WordNum + 1newWord = T rueEnd IfNext iT ext2.T ext = WordNum方法二根据相邻两字符特征判断Dim a$, tempF$, tempB$Dim n%, wNum%, i%a = T ext1.T ext 'a = Ltrim(T ext1.T ext)wNum = 0n = Len(a)For i = 1 T o n - 1 '避免超出范围tempF = Mid(a, i, 1)tempB = Mid(a, i + 1, 1)If wNum = 0 And tempF <> " " Then '对第一个单词特殊处理wNum = wNum + 1ElseIf tempF = " " And tempB <> " " ThenwNum = wNum + 1End IfNext iT ext2.T ext = wNum7.找出二维矩阵中的最大元素、最小元素及其所在位置Dim dMax%, rowMax%, colMax% '最大值、所在行、所在列Dim dMin%, rowMin%, colMin% '最小值、所在行、所在列Dim i%, j%dMax = a(1, 1): rowMax = 1: colMax = 1 '假设a(1, 1)最大,记录位置dMin = a(1, 1): rowMin = 1: colMin = 1 '假设a(1, 1)最小,记录位置For i = 1 T o UBound(a, 1) '第一维下标范围For j = 1 T o UBound(a, 2) '第二维下标范围'找最大If dMax < a(i, j) Then '与数组中的元素一一比较dMax = a(i, j)rowMax = icolMax = jEnd If'找最小If dMin > a(i, j) ThendMin = a(i, j)rowMin = icolMin = jEnd IfNext jNext iPrint "最大元素:"; dMax; ",它在第"; rowMax; "行,第"; colMax; "列" Print "最小元素:"; dMin; ",它在第"; rowMin; "行,第"; colMin; "列"8.产生n个[10,100]范围内互不相同的数据Dim T() As Integer '过程级动态数组Dim n As IntegerForm1.Clsn = InputBox("输入一个值")ReDim T(n)RandomizeFor i = 1 T o nT(i) = Int(Rnd * 91 + 10)'保证与前面的数据不等For j = 1 T o i - 1If T(i) = T(j) Then i = i - 1: Exit ForNext jNext i9.一维数组的排序(10个数据,升序为例)方法一比较交换法(经典排序法)(输出可同时进行)•外重循环I控制比较的轮数提供每轮参照元素下标(1 To n-1)•内重循环J 要与参照元素比较的元素的下标(I+1 To n) For i = 1 T o 9 …轮数及参照元素下标For j = i + 1 T o 10 …与参照元素比较的元素下标If a(i) > a(j) Thent = a(i)a(i) = a(j)a(j) = tEnd IfNext jNext i方法二选择交换法(输出可同时进行)内、外重循环的含义和作用与比较交换法相同For i = 1 T o 9k = I ‘K记录较小元素的下标For j = i + 1 T o 10If a(k) > a(j) Then k = jNext jIf k < > i Thent = a(i) : a(i) = a(k) : a(k) = tEnd IfNext i方法三冒泡法排序(输出独立进行)•外重循环I 控制比较的轮数(1 T o n-1 )决定各轮要参与比较的元素的范围•内重循环J提供每轮要与后面相邻元素进行比较的元素的下标(1T o n-I ) For i = 1 T o 9 ‟10 T o 2 Step -1For j = 1 T o 10 –i ‟1 T o i-1If a(j) > a(j + 1) Then ‟相邻元素比较t = a(j): a(j) = a(j + 1): a(j + 1) = tEnd IfNext jNext I方法四插入法排序绝对位置插入法:(结果的输出必须独立进行)第一重循环I 要决定位置的元素的下标( 2~n-1)第二重循环J 第I个元素要插入的有序数列(1~I-1)第三重循环K 当a(I)<a(J)时, 后移的元素(I-1~J)For i = 2 T o 10n = a(i) … 暂存a(i),避免冲掉For j = 1 T o i - 1If n < a(j) ThenFor k = i - 1 T o j Step –1a(k + 1) = a(k)Next ka(j) = nExit For …注意,不能少End IfNext jNext i …不用考虑n>a(i-1), n原本就放在a(i)相对位置插入法:(结果的输出必须独立进行)外重循环I 要决定位置的元素的下标( 2~n-1)内重循环J 第I个元素要插入的有序数列下标范围(I-1 ~ 1) For i = 2 T o 10n = a(i)For j = i - 1 T o 1 S tep –1 …反向If n < a(j) Thena(j + 1) = a(j)a(j) = nElsea(j + 1) = n …本句可不要Exit ForEnd IfNext jNext i10.有序数列的插入操作(假设原数组中已存放10个数据)绝对位置插入法:s = Val(InputBox("输入15~45之间的整数"))a(11) = s '提前放入For i = 1 To 10If s < a(i) Then '根据大小顺序,举实际数据定思路For k = 10 To i Step –1 'a(k + 1) = a(k)Next ka(i) = sExit For '分析少了该句的后果End IfNext iPrint "插入数据后:"For i = 1 To 11Print a(i);Next I11.有序数列的删除(假设原数组中已按升序存有10个不同数据)n = Val(InputBox("输入要删除的数据"))Rem 查找并删除k = 0 '找到的个数,决定输出范围For i = 1 To 10If n = a(i) Thenk = 1For j = i + 1 To 10 '将数据前移,填补删除空位a(j - 1) = a(j)Next jExit ForEnd IfNext iRem由k值决定输出范围,k=0,输出10个,k=1,输出9个数据Print "删除之后的结果:"For i = 1 To 10 - kPrint a(i);Next I12.统计文本框输入的字符串中,各字母出现的次数Dim a(65 To 90) As Integer 'a数组用于统计各字母出现的次数Dim c As String, le As Integer, d As String * 1Dim i%, j%, k%Picture1.Clsc = Text1.Text '取出待考察的字符串le = Len(c) '求字符串的长度For i = 1 To led = UCase(Mid(c, i, 1)) '(不区分大小写)取出字符转换成大写 If d >= "A" And d <= "Z" Thenj = Asc(d)a(j) = a(j) + 1 '对应数组元素加1End IfNext i For i = 65 To 90 '输出字母及其出现的次数If a(i) <> 0 Then '表明对应字母出现了k = k + 1 '用于控制输出格式Picture1.Print Chr$(i); "="; a(i); " ";If k Mod 9 = 0 Then Picture1.Print '每行输出9个 End IfNext j12.二分法查找(前提原数组有序,设原数组已按升序排序)Dim n%Dim bot%, mid%, top%, find As Booleann = Val(InputBox("请输入要查找的数据"))bot = 1: top = 10find = False '是否找到的标志Do '三个分支mid = Int((bot + top) / 2)If n = a(mid) Thenfind = TrueMsgBox "在a(" & mid & ")" & "找到数据" & nExit Do '可不要ElseIf n < a(mid) Thentop = mid - 1ElseIf n > a(mid) Thenbot = mid + 1End IfLoop Until find = True Or bot > topIf find = False Then MsgBox "没找到" & n & "."13.字符串的加密、解密问题加密解密问题.加密规律:小写字母: a-d,b-e……w-z,x-a,y-b,z-c大写字母: A-D,B-E……W-Z,X-A,Y-B,Z-C其它字符不变。
vb循环必须掌握经典算法
经典算法:1 求两个数的最大公约数和最小公倍数方法一:课本74页,辗转相除法(希望大家看到这个算法,能够理解程序的意思,比如考试出根据程序写结果或者程序填空题)方法二:两个数的最大公约数,然后满足能被这两个数整除,既余数都为0。
求最大公约数,根据数学原理,最大公约数是最大是两个数中小的那个数(比如4和8,最大公约数是4),最小是1(比如5和7,最大公约数是1),程序段如下Private Sub Form_Click()Dim n As Integer, m As Integer, r As Integer, i As Integern = InputBox("请输入第一个数")m = InputBox("请输入第二个数")r = IIf(n < m, n, m) 'iif函数的用法参见课本67页For i = r To 1 Step -1If n Mod i = 0 And m Mod i = 0 ThenPrint n & "," & m & "这两个数的最大公约是" & iExit ForEnd IfNext iPrint n & "," & m & "这两个数的最小公倍数是" & n*m/iEnd Sub2 判断一个数是否为素数,假定概数是n如果一个数是素数,那么它只能被1和它本身整除,所以该数除以2到n-1之间的所有余数都不为0,反之,该数除以2到n-1之间只要有一个余数为0,它就不是素数(这个时候就可以提前结束循环,肯定该数不是素数),所以循环的初值是2,终止时n-1,从数学原理终止为n/2,spr(n)都可以,其中n-1>n/2>spr(n),所以终止为spr(n)的循环次数最少方法一:如果是不素数提前结束循环,是素数,退出循环是循环变量的值不满足终止Private Sub Form_Click()Dim n%, i%n = InputBox("请输入一个数")For i = 2 To n - 1If n Mod i = 0 ThenPrint n & "不是素数"Exit ForEnd IfNext iIf i = n ThenPrint n & "是素数"End IfEnd Sub方法二:不管这个数是否为素数,假定它是素数,用一个变量(一般用flag)记住它是素数的状态(flag=1),否则反之flag=0Private Sub Form_Click()Dim n%, i%, flag%flag = 1n = InputBox("请输入一个数")For i = 2 To n - 1If n Mod i = 0 Thenflag = 0Exit ForEnd IfNext iIf flag = 1 ThenPrint n & "是素数"ElsePrint n & "不是素数"End IfEnd Sub3 找出1到300之间的所有素数,并且5个一行输出Private Sub Form_Click()Dim n%, i%, flag%n = 0For j = 3 To 300flag = 1For i = 2 To j - 1If j Mod i = 0 Thenflag = 0Exit ForEnd IfNext iIf flag = 1 ThenPrint j;n = n + 1If n Mod 5 = 0 Then PrintEnd IfNext jEnd Sub4例4-12教材80页,求把do while t>0.000001 改成 1//t>0.0000105 求1+3+5+7+……+100的和Private Sub Form_Click()Dim i%, sum% sum = 0)!12(1)1(....!71!51!3111--++-+--n nsum = sum + iNext iPrint "1+3+....+100=" & sumEnd Sub6.求1!+2!+3!+…..10!之和Private Sub Form_Click()Dim i%, sum!, f! ‘注意这里定义为单精度,否则产生错误sum = 0f = 1For i = 1 To 10f = f * isum = sum + fNext iPrint "1!+2!+....+10!=" & sumEnd Sub7打印九九乘法表.Private Sub Form_Click()Dim i%, j%For i = 1 To 9For j = 1 To 9se = i & "×" & j & "=" & i * jPrint Tab((j - 1) * 9 + 1); se;Next jPrint '每输入完一行,打印换行,继续输出下一行Next iEnd Sub打印下三角九九乘法表Private Sub Form_Click()Dim i%, j%For i = 1 To 9For j = 1 To ise = i & "×" & j & "=" & i * jPrint Tab((j - 1) * 9 + 1); se;Next jPrint '每输入完一行,打印换行,继续输出下一行Next iEnd Sub打印上三角九九乘法表Private Sub Form_Click()Dim i%, j%For i = 1 To 9se = i & "×" & j & "=" & i * jPrint Tab((j - 1) * 9 + 1); se;Next jPrint '每输入完一行,打印换行,继续输出下一行Next iEnd Sub8.猴子吃桃子。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、计数、求和、求阶乘等简单算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。
即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。
将程序编写在一个GetTJput过程中,代码如下:Public Sub GetTJput()Dim a(1 To 100) As IntegerDim x(1 To 10) As IntegerDim i As Integer, p As Integer'产生100个[0,99]范围内的随机整数,每行10个打印出来For i = 1 To 100a(i) = Int(Rnd * 100)If a(i) < 10 ThenForm1.Print Space(2); a(i);ElseForm1.Print Space(1); a(i);End IfIf i Mod 10 = 0 Then Form1.PrintNext i'统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来For i = 1 To 100p = a(i) Mod 10 ' 求个位上的数字If p = 0 Then p = 10x(p) = x(p) + 1Next iForm1.Print "统计结果"For i = 1 To 10p = iIf i = 10 Then p = 0Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个"Next iEnd Sub二、求两个整数的最大公约数、最小公倍数分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)(1) 对于已知两数m,n,使得m>n;(2) m除以n得余数r;(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);(4) m←n,n←r,再重复执行(2)。
例如: 求m=14 ,n=6 的最大公约数. m n r14 6 26 2 0m=inputBox("m=")n=inputBox("n=")nm=n*mIf m < n Then t = m: m = n: n = tr=m mod nDo While (r <> 0)m=nn=rr= m mod nLoopPrint "最大公约数=", nPrint "最小公倍数=", nm/n三、判断素数只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。
(可用以下程序段实现)m =val( InputBox("请输入一个数"))For i=2 To int(sqr(m))If m Mod i = 0 Then Exit ForNext iIf i > int(sqr(m)) ThenPrint "该数是素数"ElsePrint "该数不是素数"End If将其写成一函数,若为素数返回True,不是则返回FalsePrivate Function Prime( m as Integer) As BooleanDim i%Prime=TrueFor i=2 To int(sqr(m))If m Mod i = 0 Then Prime=False: Exit ForNext iEnd Function四、验证哥德巴赫猜想(任意一个大于等于6的偶数都可以分解为两个素数之和)基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。
如n1不是素数,就不必再检查n2是否素数。
先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。
然后使n1+2 再检验n1、n2是否素数,…直到n1=n/2为止。
利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:Dim n%,n1%,n2%n=Val(InputBox("输入大于6的正整数"))For n1=3 to n step 2n2=n-n1If prime(n1) ThenIf prime(n2) thenPrint n & "=" & n1 & "+" & n2Exit For '结束循环End ifEnd ifNext n1五、排序问题1.选择法排序(升序)基本思想:1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;3)依次类推,选择了n-1次后,这个数列已按升序排列。
程序代码如下:For i = 1 To n - 1imin = iFor j = i + 1 To nIf a(imin) > a(j) Then imin = jNext jtemp = a(i)a(i) = a(imin)a(imin) = tempNext I2.冒泡法排序(升序)基本思想:(将相邻两个数比较,小的调到前头)1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
程序段如下For i = 1 To n - 1For j = 1 To n-iIf a(j) > a(j+1) Thentemp=a(j):a(j)=a(j+1):a(j+1)=tempEnd ifNext jNext i3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)基本思想:1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:Do While ia <= UBound(A) And ib <= UBound(B) '当A和B数组均未比较完If A(ia) < B(ib) ThenC(ic) = A(ia):ia = ia + 1ElseC(ic) = B(ib):ib = ib + 1End Ific = ic + 1LoopDo While ia <= UBound(A) 'A数组中的剩余元素抄入C数组C(ic) = A(ia)ia = ia + 1:ic = ic + 1LoopDo While ib <= UBound(B) 'B数组中的剩余元素抄入C数组C(ic) = B(ib)ib = ib + 1:ic = ic + 1Loop六、查找问题1.①顺序查找法(在一列数中查找某数x)基本思想:一列数放在数组a(1)---a(n)中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。
用变量p表示a数组元素下标,p初值为1,使x与a(p)比较,如果x不等于a(p),则使p=p+1,不断重复这个过程;一旦x等于a(p)则退出循环;另外,如果p大于数组长度,循环也应该停止。
(这个过程可由下语句实现)p = 1Do While x <> a(p) And p < =np = p + 1Loop下面写一查找函数Find,若找到则返回下标值,找不到返回0Option Base 1Private Function Find( a( ) As Single,x As Single) As IntegerDim n%,p%n=Ubound( a )p = 1Do While x <> a(p) And p < =np = p + 1LoopIf p>n then p=0Find=pEnd Function②基本思想:一列数放在数组a(1)---a(n)中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。
(查找子过程如下。
index:存放找到元素的下标。
)Public Sub Search(a() As Variant, key As Variant, index%)Dim i%For i = LBound(a) To UBound(a)If key = a(i) Thenindex = iExit SubEnd IfNext iindex = -1End Sub2.折半查找法(只能对有序数列进行查找)基本思想:设n个有序数(从小到大)存放在数组a(1)----a(n)中,要查找的数为x。
用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下:(1)x=a(mid),则已找到退出循环,否则进行下面的判断;(2)x<a(mid),x必定落在bot和mid-1的范围之内,即top=mid-1;(3)x>a(mid),x必定落在mid+1和top的范围之内,即bot=mid+1;(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot<=top。
将上面的算法写成如下函数,若找到则返回该数所在的下标值,没找到则返回-1。
Function search(a() As Integer, x As Integer) As IntegerDim bot%, top%, mid%Dim find As Boolean '代表是否找到bot = LBound(a)top = UBound(a)find = False '判断是否找到的逻辑变量,初值为FalseDo While bot <= top And Not findmid = (top + bot) 2If x = a(mid) Thenfind = TrueExit DoElseIf x < a(mid) Thentop = mid - 1Elsebot = mid + 1End IfLoopIf find Thensearch = midElsesearch = -1End IfEnd Function七、插入法把一个数插到有序数列中,插入后数列仍然有序基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。