VB常用算法介绍
- 格式:doc
- 大小:60.00 KB
- 文档页数:22
VB常用算法---累加和连乘一、算法说明累加形式: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 = 1For i = 1 To ns = s * iNext iPrint sEnd Sub错误的写法:Private Sub Command1_Click()Dim n%, i%, s&n = Val(InputBox("输入n"))For i = 1 To ns = 1 ‘赋初值语句位置不对!s = s * iNext iPrint s ‘输出s的值为n,而不是n!End Sub二、应用举例例1. 根据下列公式,求自然对数e的的近似值。
要求:误差小于0.00001Private Sub Command1_Click()Dim i%, n&, t!, e!e = 2i = 1t = 1Do While t > 0.00001i = i + 1t = t / ie = e + tLoopPrint "计算"; i+1; "项后,自然对数e值为:"; ePr int Exp(1) ‘与上句输出值进行对比以证明算法的正确性End Sub解题技巧1)由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。
设定循环变量i和通项变量t,注意各变量的初值;2)分解通项表达式中各因子,并分别将各因子用循环变量表示;3)如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;4)根据步骤1、2、3,写出通项表达式;5)根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。
1、算法说明1) 选择法排序(1) 从n个数中选出最⼩数的下标,出了循环,将最⼩数与第⼀个数交换位置;(2) 除第⼀个数外,在剩下的n-1个数中再按⽅法(1)选出次⼩的数,与第⼆个数交换位置;(3) 以此类推,最后构成递增序列。
譬如:8 6 9 3 2 7第⼀轮交换后 2 6 9 3 8 7第⼆轮交换后 2 3 9 6 8 7第三轮交换后 2 3 6 9 8 7第四轮交换后 2 3 6 7 8 9第五轮⽆交换 2 3 6 7 8 9程序代码如下:Private Sub xzPaiXu(a() As Double, sheng As Boolean)'a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。
Dim i As Integer, j As IntegerDim temp As DoubleDim m As IntegerFor 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 = jElseIf a(j) > a(m) Then m = jEnd IfNext j '将最值元素与第i个元素交换temp = a(i)a(i) = a(m)a(m) = tempNext iEnd Sub。
VB常用算法(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=1For i=1To ns=s*iNext iPrint sEnd Sub 错误的写法:Private Sub Command1_Click()Dim n%,i%,s&n=Val(InputBox("输入n"))For i=1To ns=1‘赋初值语句位置不对!s=s*iNext iPrint s‘输出s的值为n,而不是n!End Sub应用举例根据下列公式,求自然对数e的的近似值。
要求:误差小于0.00001Private Sub Command1_Click()Dim i%,n&,t!,e!e=2i=1t=1Do While t>0.00001i=i+1t=t/ie=e+tLoopPrint"计算了";i;"项目和是:";ePrint Exp(1)‘与上句输出值进行对比以证明算法的正确性End Sub解题技巧1)由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。
设定循环变量和通项变量,注意各变量的初值;2)分解通项表达式中各因子,并分别将各因子用循环变量表示;3)如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;4)根据步骤1、2、3,写出通项表达式;5)根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。
VB常用算法---约数因子一、算法说明:1.最大公约数:用辗转相除法求两自然数m、n的最大公约数。
〔1〕首先,对于已知两数m、n,比较并使得m>n;〔2〕m除以n得余数r;〔3〕若r=0,则n为求得的最大公约数,算法结束;否则执行步骤〔4〕〔4〕m←n n←r 再重复执行〔2〕例如1: 10与5分析步骤:m=10 n=5r=m mod n=0所以n<n=5>为最大公约数例如2: 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>为最大公约数算法实现:1〕循环实现Private Function GCD<ByVal m As Long, ByVal n As Long> As LongDim temp As LongDim r As LongIf m < n Then temp = m: m = n: n = tempDor = m Mod nIf r = 0 Then Exit Dom = nn = rLoopGCD = nEnd Function说明:m和 n 是要求解最大公约数的两个自然数,函数的返回值是m和n的最大公约数。
2〕递归方法实现Private Function GCD<ByVal m As Long, ByVal n As Long> As LongDim temp As LongDim r As LongIf m < n Then temp = m: m = n: n = tempr = m Mod nIf r = 0 ThenGCD = nElsem = nn = rGCD = GCD<m, n>End IfEnd Function说明:m和 n 是要求解最大公约数的两个自然数,函数的返回值是m和n的最大公约数。
Visual Basic常用算法从逻辑结构上看,应用程序= 算法+ 数据结构。
(1)数据结构(Data-Structure),计算机将数据元素依据某种逻辑联系进行存储和组织的方式。
许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重依赖于是否选择了最优的数据结构。
选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。
这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。
(2)算法(Algorithm),由基本运算及规定的运算顺序所构成的完整解题步骤。
一个算法应该具有以下五个重要的特征:①有穷性,算法必须保证执行有限步之后结束。
②确切性,算法的每一步骤必须有确切的定义。
③输入,算法有0个或多个输入,以描述运算量的初始值。
0个输入是指算法本身包含了初始值。
④输出,算法有一个或多个输出,以反映对输入数据加工后的结果。
没有结果的算法是毫无意义的。
⑤可行性,算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。
计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
程序(Programme)就是用计算机语言描述的算法。
流程图(Flow Charts)就是图形化的算法。
解决同一问题可以有多种算法描述。
实际问题的算法种类繁多,总体上可以分为两大类:数值算法和非数值法。
对VB程序语言设计的初学者,可能会感到掌握控件的使用不难,难得的是理解和掌握算法。
但是,算法是程序的核心、编程的基础,离开算法,一事无成。
我们将介绍常用的VB算法。
VB常用简单算法VB是一种过程式编程语言,被广泛用于Windows平台的软件开发。
它提供了一系列的算法和数据结构可以用于解决复杂的问题。
下面是一些VB常用的简单算法:1. 顺序(Sequential Search):顺序是一种简单的算法,它检查数组中的每个元素,直到找到目标元素或完整个数组。
该算法的时间复杂度为O(n)。
```vbFunction SequentialSearch(arr( As Integer, target As Integer) As IntegerDim i As IntegerFor i = 0 To UBound(arr)If arr(i) = target ThenReturn iEnd IfNextReturn -1 '表示未找到End Function```2. 二分(Binary Search):二分是一种高效的算法,它将目标元素与数组的中间元素比较,根据比较结果确定目标元素在数组的左半部分还是右半部分,并重复这个过程,直到找到目标元素或范围缩小到空集。
该算法要求数组必须是有序的,并且时间复杂度为O(log n)。
```vbFunction BinarySearch(arr( As Integer, target As Integer) As IntegerDim low As Integer = 0Dim high As Integer = UBound(arr)While low <= highDim mid As Integer = (low + high) \ 2If arr(mid) = target ThenReturn midElseIf arr(mid) < target Thenlow = mid + 1Elsehigh = mid - 1End IfEnd WhileReturn -1 '表示未找到End Function```3. 冒泡排序(Bubble Sort):冒泡排序是一种简单的排序算法,它重复地比较相邻的元素并交换顺序,直到整个数组按照升序或降序排列。
常考算法: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常用算法(二)最值问题1、算法说明在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
Private Sub Command1_Click()Dim n As Integer, i As Integer, min As Integer, max As Integer, aver As S ingle, s As Integern = Val(InputBox("输入个数:"))s = Int(Rnd * 100) + 1max = smin = saver = sPrint "第1个数是:" & sFor i = 2 To ns = Int(Rnd * 100) + 1Print "第" & i & "个数是:" & sIf s > max Then max = sIf s < min Then min = saver = aver + sNext iaver = aver / nPrint "max="; max; "min="; min; "aver="; averEnd Sub解题技巧最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。
2、实战练习1)补充代码(2000春二(9))本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列中为最小。
. . 常用算法介绍
VB 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生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 Integer Dim x(1 To 10) As Integer . . Dim i As Integer, p As Integer '产生100个[0,99]围的随机整数,每行10个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.Print Next i '统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来 For i = 1 To 100 p = a(i) Mod 10 ' 求个位上的数字
If p = 0 Then p = 10 x(p) = x(p) + 1 Next i Form1.Print "统计结果" For i = 1 To 10 . . p = i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End 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 r 14 6 2 6 2 0 m=inputBox("m=") n=inputBox("n=") nm=n*m If m < n Then t = m: m = n: n = t r=m mod n
Do While (r <> 0) m=n n=r r= m mod n Loop Print "最大公约数=", n Print "最小公倍数=", nm/n 三、判断素数 只能被1或本身整除的数称为素数 基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现) . . m =val( InputBox("请输入一个数")) For i=2 To int(sqr(m)) If m Mod i = 0 Then Exit For Next i If i > int(sqr(m)) Then Print "该数是素数" Else Print "该数不是素数" End If 将其写成一函数,若为素数返回True,不是则返回False Private Function Prime( m as Integer) As Boolean Dim i% Prime=True For i=2 To int(sqr(m))
If m Mod i = 0 Then Prime=False: Exit For Next i End 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 2 n2=n-n1 If prime(n1) Then If prime(n2) then Print n & "=" & n1 & "+" & n2
Exit For '结束循环 End if End if Next n1
五、排序问题 1.选择法排序(升序) 基本思想: 1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置; 2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置; . . 3)依次类推,选择了n-1次后,这个数列已按升序排列。
程序代码如下: For i = 1 To n - 1 imin = i For j = i + 1 To n If a(imin) > a(j) Then imin = j Next j temp = a(i) a(i) = a(imin) a(imin) = temp Next I
2.冒泡法排序(升序) 基本思想:(将相邻两个数比较,小的调到前头) 1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数; 3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两. . 比较。 程序段如下 For i = 1 To n - 1 For j = 1 To n-i If a(j) > a(j+1) Then temp=a(j): a(j)=a(j+1): a(j+1)=temp End if Next j Next i
3.合并法排序(将两个有序数组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) Then C(ic) = A(ia): ia = ia + 1 Else . . C(ic) = B(ib): ib = ib + 1 End If ic = ic + 1 Loop Do While ia <= UBound(A) 'A数组中的剩余元素抄入C数组 C(ic) = A(ia) ia = ia + 1: ic = ic + 1 Loop Do While ib <= UBound(B) 'B数组中的剩余元素抄入C数组 C(ic) = B(ib) ib = ib + 1: ic = ic + 1 Loop
六、查找问题 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 = 1