VB常用算法总结大全详细版.ppt
- 格式:ppt
- 大小:570.00 KB
- 文档页数:25
一、累加算法如果在设计过程中遇到求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码对应的字符。
计数与求和求数组最大值fmax = x(1)For i = 2 To nIf x(i) > fmax Then fmax = x(i)Next i输入数组For i = 1 To ma(i) = InputBox("a(" + Str(i) + ")=") Next i输出数组(每行n个)For i = 1 To mPrint a(i); if i mod n =0 then printNext i随机数产生[N,M]范围内数组For i = 1 To ma(i) = int(rnd*(M-N+1))+NNext i数组元素倒置For i =1 To n\2t=A(i)A(i)=A(n-i+1)A(n-i+1)=tNext I在数组中查找数1.原始算法For i = 1 To nIf x = a(i) Then j = iNext i2.变种1For i = 1 To 8If x = a(i) ThenExit ForNext i在数组中删除特定的数For i = 1 To 8If x = a(i) Then j = iNext iFor i = j To 7a(i) = a(i + 1)Next i求两个整数的最大公约数、最小公倍数1.原始程序Dim n%,m%,nm%,r% m=Val(InputBox("m="))n=Val(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 2.变种1Dim n%,m%,nm%,r%m=Val(InputBox("m="))n=Val(InputBox("n="))nm=n*mr=m mod nDo While (r <> 0)m=nn=rr= m mod nLoopPrint "最大公约数=", nPrint "最小公倍数=", nm/n 3.变种2Dim n%,m%,nm%,r%m=Val(InputBox("m="))n=Val(InputBox("n="))nm=n*mIf m<n Then t=m: m=n: n=tDo While (r <> 0)r= m mod nm=nn=rLoopPrint "最大公约数=", mPrint "最小公倍数=", nm/m判断素数及验证哥德巴赫猜想1.判断N是否是素数For i= 2 To Int(Sqr(n))If n Mod i = 0 Then Exit ForNext iIf i> Int(Sqr(n)) ThenPrint n; " 是素数"ElsePrint n; " 不是素数"End If2.判断N是否是素数(变种1)flag=0For i= 2 To Int(Sqr(n))If n Mod i = 0 Then flag =1 :Exit ForNext iIf flag =0 ThenPrint n; " 是素数"ElsePrint n; " 不是素数"End If3.哥德巴赫猜想Dim N%, N1%, N2%, I%, K1%, K2%N=V al(InputBox("输入大于6的偶数"))For N1 = 3 To N \ 2 Step 2K1 = Int(Sqr(N1))For I = 2 To K1 '判断N1是否是素数If N1 Mod I = 0 Then Exit ForNext IIf I > K1 Then '如果N1为素数,将N分解为N1+N2N2 = N - N1K2 = Int(Sqr(N2))For I = 2 To K2 '判断N2是否是素数If N2 Mod I = 0 Then Exit ForNext IIf I > K2 Then ' 如果N2也为素数,则打印输出Print N & "=" & N1 & "+" & N2End IfEnd IfNext N1冒泡法排序(n个数排序)For j = 1 To n-1For i = 1 To n - jIf a(i) > a(i + 1) Thentemp = a(i): a(i) = a(i + 1): a(i + 1) = tempNext iNext j选择法排序(n个数排序)1.原始代码For j = 1 To n-1p = jFor i = j + 1 To nIf a(p) > a(i) Then p = iNext iIf (p <> j) Then temp= a(j): a(j) = a(p): a(p) = temp Next j2.变种1For i = 1 To n-1For j=i+1 to nIf a(i) > a(j) Thentemp= a(j): a(j) = a(i): a(i) = tempEnd IfNext jForm1.Print a(i)Next iForm1.print a(n)数进制的转换(公用进制转换,将n转换成k进制) 1.Dim n As Integer, k As Integer, x As StringDim m As Integer, t As Integern = Inputbox(“n="): k = Inputbox(“k=")x= "": m = n : n = Abs(n)Do While n <> 0t = n Mod kIf k=16 And t>9 Then x = Chr(Asc("a")+t-10) + x Else x = t & xn = n \ kLoopIf m < 0 Then x = "-" + x2.变种1(采用连除2取余数的方法,将一个十进制数转换为二进制数)Dores = dec mod 2 '求出除以2的余数Bin = res & binDec = dec\2Loop While dec>0矩阵的转置1.M* M方阵For i = 2 To MFor j = 1 To I-1Temp=a(i,j)a(i, j) = a(j, i)a(j, i)=TempNext jNext i2.M*N的矩阵For i = 1To MFor j = 1To Nb(j,i) = a(i,j)Next jNext i约瑟夫问题—有n个人围成一圈,顺序排号。
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常用算法算法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整除的数的个数、并求它们的累加和。