VB算法总结:1、最大公约数算法说明1)最大公约数:用辗转相除法求两自然数m、n的最大公约数。
(1)首先,对于已知两数m、n,比较并使得m>n;(2)m除以n得余数r;(3)若r=0,则n为求得的最大公约数,算法结束;否则执行步骤(4)(4)m n n r 再重复执行(2)譬如:10与5分析步骤:m=10 n=5r=m mod n=0所以n(n=5)为最大公约数24与9分析步骤:m=24 n=9r=m mod n=6r≠0 m=9 n=6r=m mod n=3r≠0 m=6 n=3r=m mod n=0所以n(n=3)为最大公约数算法实现Private Function GCD(ByVal m As Long, ByVal n As Long) As LongDim temp As LongIf m < n Then temp = m: m = n: n = tempDim r As LongDor = m Mod nIf r = 0 Then Exit Dom = nn = rLoopGCD = nEnd Function2)最小公倍数m×n÷最大公约数3)互质数最大公约数为1的两个正整数2、素数算法说明素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。
判别某数m是否是素数的经典算法是:对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。
Private Function prime(ByVal n%) As BooleanDim i %prime=trueFor i = 2 To sqr(n)If n Mod I = 0 ThenPrime=falseExit ForendifNext IEnd Function3、进制转换算法说明1)十进制正整数m转换为R(2-16)进制的字符串。
思路:将m不断除r取余数,直到商为0,将余数反序即得到结果。
算法实现:Private Function Tran(ByVal m As Integer, ByVal r As Integer) As String Dim StrDtoR As String, n As IntegerDo While m <> on = m Mod rm = m \ rIf n > 9 ThenStrDtoR = Chr(65 + n - 10) & StrDtoRElseStrDtoR = n & StrDtoREnd IfLoopTran = StrDtoREnd Function2)R(2-16)进制字符串转换为十进制正整数。
思路:R进制数每位数字乘以权值之和即为十进制数。
算法实现:Private Function Tran(ByVal s As String, ByVal r As Integer) As integer Dim n As Integer, dec As Integers = UCase(Trim(s))For i% = 1 To Len(s)If Mid(s, i, 1) >= "A" Thenn = Asc(Mid(s, i, 1)) - Asc("A") + 10 Elsen = Val(Mid(s, i, 1))End Ifdec = dec + n * r ^ (Len(s) - i)Next iTran = decEnd Function4、排序问题(1).选择排序法(升序)基本思想:1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;3)依次类推,选择了n-1次后,这个数列已按升序排列。
O ption base 1Sub sort(a() as integer)D im i%,j%,t%,p%,n%N=ubound(a)For i = 1 To n - 1p = iFor j = i + 1 To nIf a(j) > a(p) Then p = jNext jt = a(i)a(i) = a(p)a(p) = tNext iEnd sub2.冒泡法排序(升序)基本思想:(将相邻两个数比较,小的调到前头)1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
程序段如下Sub sort(a() as integer)D im i%,j%,n%,t%n=ubound(a)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 iEnd sub5、查找问题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 Function6、插入法把一个数插到有序数列中,插入后数列仍然有序基本思想: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 = 1Do While x > a(p) And p < =n ' 确定x应插入的位置p = p + 1LoopFor i = n To p Step -1a(i + 1) = a(i)Next ia(p) = xEnd Sub7、矩阵(二维数组)运算(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中任一元素∑=⨯=lkjkbkiajic1)),(),((),((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 (3)矩阵传置例:有二维数组a(5,5),要对它实现转置,可用下面两种方式:(1)For i=1 to 4 (2) For i=2 to 5For j=i+1 to 5 For j=1 to i-1t=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 jNext j Next iNext i 用第一种方法编写的程序Private SubCommand1_Click()Dim a(5, 5) As IntegerFor i = 1 To 5For j = 1 To 5a(i, j) = Int(Rnd * 90) + 10Print a(i, j); " ";Next jPrintNext iPrintFor i = 1 To 4For j = i + 1 To 5t = a(i, j)a(i, j) = a(j, i)a(j, i) = tNext jNext iFor i = 1 To 5For j = 1 To 5Print a(i, j); " ";Next jPrintNext iEnd Sub(4)求二维数组中最大元素及其所在的行和列基本思路同一维数组,可用下面程序段实现(以二维数组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 iPrint "最大元素是"; MaxPrint "在第" & row & "行,"; "第" & Column & "列"8、迭代法算法思想:对于一个问题的求解x ,可由给定的一个初值x0,根据某一迭代公式得到一个新的值x1,这个新值x1比初值x0更接近要求的值x ;再以新值作为初值,即:x1→x0,重新按原来的方法求x1,重复这一过和直到|x1-x0|<ε(某一给定的精度)。