《常用算法介绍精选PPT.ppt》由会员分享,可在线阅读,更多相关《常用算法介绍精选PPT.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、关于常用算法介绍第1页,讲稿共77张,创作于星期日算法1:累加和累乘累加形式:累加形式:V=V+e连乘形式:连乘形式:V=V*e其中:其中:V是变量,是变量,e是递增表达式。累加和是递增表达式。累加和连乘一般通过循环结构来实现。连乘一般通过循环结构来实现。注意:需在执行循环体前对变量注意:需在执行循环体前对变量V赋初值。赋初值。一般的,累加时置初值一般的,累加时置初值0;连乘时置初值为;连乘时置初值为1。第2页,讲稿共77张,创作于星期日例如求求N!的结果。的结果。PrivateSubCommand1_Click()Dimn%,i%,s&n=Val(InputBox(输入输入n)s=1Fori
2、=1Tons=s*iNextiPrintsEndSub第3页,讲稿共77张,创作于星期日错误的例子PrivateSubCommand1_Click()Dimn%,i%,s&n=Val(InputBox(输入输入n)Fori=1Tons=1赋初值语句位置不对!赋初值语句位置不对!s=s*iNextiPrints输出输出s的值为的值为n,而不是,而不是n!EndSub第4页,讲稿共77张,创作于星期日根据下列公式,求自然对数根据下列公式,求自然对数e的的近似值。的的近似值。要求:误差小于要求:误差小于0.00001Private Sub Command1_Click()Dim i%,n&,t!,e
3、!e=2 i=1 t=1 Do While t 0.00001 i=i+1 t=t/i e=e+t Loop Print 计算了计算了;i;项目和是:项目和是:;e Print Exp(1)与上句输出值进行对比以证明算法的正与上句输出值进行对比以证明算法的正确性确性End Sub第5页,讲稿共77张,创作于星期日解题技巧解题技巧1)由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用次数,所以这类题目一般用Do循环,很少用循环,很少用For循环。设定循环变量和通项循环。设定循环变量和通项变量,注意各
4、变量的初值;变量,注意各变量的初值;2)分解通项表达式中各因子,并分别将各因子用循环变量表示;分解通项表达式中各因子,并分别将各因子用循环变量表示;3)如果步骤如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程;过程;4)根据步骤根据步骤1、2、3,写出通项表达式;,写出通项表达式;5)根据精度要求(往往是通项小于根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。通常是用:一条满足精度要求后跳出循环的语句。通常是用:
5、if通项表达式通项表达式10(-N)thenexitdo,注意这句话一般需放在累加或者连乘式之前。,注意这句话一般需放在累加或者连乘式之前。第6页,讲稿共77张,创作于星期日根据根据X值计算:值计算:n1,2,要求:要求:n项绝对值小于等于项绝对值小于等于10-6为止。为止。注意:如果调试运行时死循环,可以按注意:如果调试运行时死循环,可以按CtrlBreak中中断死循环,不需要重新启动机器。(或者断死循环,不需要重新启动机器。(或者Ctrl+ScrollLock)第7页,讲稿共77张,创作于星期日privateFunctioncomp(naslong)aslongdimIaslongdimr
6、esultaslongresult=1此处注意,由于是连乘,初值为此处注意,由于是连乘,初值为1forI=1to2*(n-1)result=result*InextIcomp=resultEndFunction第8页,讲稿共77张,创作于星期日PrivateSubCommand1_Click()DimnAsLong,dblCosAsDouble,xAsDoublex=Val(Text1.Text)n=1DodblCos=(-1)(n+1)*x(2*(n-1)/comp(n)IfAbs(dblCos)maxThenmax=sIfsminThenmin=saver=aver+sNextiaver=
7、aver/nPrintmax=;max;min=;min;aver=;averEndSub第13页,讲稿共77张,创作于星期日解题技巧解题技巧最大值、最小值、平均值类型题目往往和数最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列最小值时,同时记录该值所在的行号和列号。号。第14页,讲稿共77张,创作于星期日实战练习实战练习1)补充代码(补充代码(2000春
8、二(春二(9)本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列中为最小。在一个数组中可能存在,也可能不存在这样的元素。数组各本程序的功能是在二维数组中查找鞍点元素,即该元素在所在行中为最大,且在所在列中为最小。在一个数组中可能存在,也可能不存在这样的元素。数组各元素的值从文件元素的值从文件data.txt中读取。中读取。PrivateSubForm_Click()Dima(3,3)AsInteger,iAsInteger,jAsIntegerDimmaxvrAsInteger,colAsInteger,AsIntegerOpendata.txtForInputAs#
9、1Fori=1To3Forj=1To3Input#1,a(i,j)Printa(i,j);NextjPrintNextiFori=1To3maxvr=(1)col=1Forj=2To3Ifmaxvra(j,col)Then(3)NextjIfj3ThenPrinta(;i;,;col;)=;a(i,col)=1EndIfIf(4)ThenPrint鞍点元素不存在鞍点元素不存在NextiEndSub第15页,讲稿共77张,创作于星期日2)编程题(编程题(2002秋上机试卷秋上机试卷05)随机生成所有数组元素都是两位数的随机生成所有数组元素都是两位数的33的二维数组,找出的二维数组,找出其中不同行
10、、不同列的三个数组元素的乘积最大的一组,并将其中不同行、不同列的三个数组元素的乘积最大的一组,并将这三个元素显示在图片框中。这三个元素显示在图片框中。第16页,讲稿共77张,创作于星期日VB常用算法(三)素数常用算法(三)素数算法说明算法说明素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。判别某数m是否是素数的经典算法是:对于m,从I2,3,4,m1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。第17页,讲稿共77张,创作于星期日PrivateFunctionsushu(ByValnAsLong)AsBooleanDimiAsLo
11、ngFori=2Ton-1If(nModi)=0ThenExitForNextIIfI=nthensushu=TrueEndFunction很显然,实际上,我们可以改进上面Fori=2Ton1为:Fori=2Toint(sqr(m)这样可以很好的提高效率。以上判断是否为素数的代码务必识记!第18页,讲稿共77张,创作于星期日应用举例应用举例求100200之内素数。PrivateSubCommand1_Click()DimjAsIntegerForj=100To200Ifsushu(j)=TrueThenPrintjEndIfNextjEndSub解题技巧解题技巧识记判断素数的算法过程,根据题意
12、,灵活调用!第19页,讲稿共77张,创作于星期日实例说明实例说明编程题(2002年春上机试卷04)找出10000以内所有可以表示为两个平方数和的素数。思路:首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shuI均为平方数,则说明其可以表示为两个平方数之和。)判断数I是否为平方数的方法:sqr(i)=int(sqr(i)PrivateSubCommand1_Click()DimjAsIntegerDimmAsLong,nAsLongForj=2To10000Ifsushu(j)=TrueThenIfpf(j,m,n)=T
13、rueThenList1.AddItemj&=&m&+&nEndIfEndIfNextjEndSubPrivateFunctionpf(ByValshuAsLong,mAsLong,nAsLong)AsBooleanDimiAsLongFori=1Toshu-1If(Sqr(i)=Int(Sqr(i)And(Sqr(shu-i)=Int(Sqr(shu-i)Thenpf=Truem=in=shu-iExitFunctionEndIfNextEndFunction第20页,讲稿共77张,创作于星期日2、实战练习、实战练习1)补充代码(2002春二(7)下列程序的功能是:查找四位正整数中的超级素数
14、。超级素数的定义为:当一个素数从低位到高位依次去掉一位数后剩下的数仍然是素数,则此数为超级素数。如数2333、233、23、2均为素数,所以2333为超级素数。OptionExplicitPrivateSubCommand1_Click()DimIAsInteger,flgAsBooleanForI=1001To9999Step2Callsup_prime(I,flg)IfflgThenPrintIEndIfNextIEndSub第21页,讲稿共77张,创作于星期日PrivateSubsup_prime((1),FAsBoolean)DimpAsInteger F=TrueDoWhileN0I
15、fprime(N)Then(2)Else(3)ExitSubEndIfLoopEndSubPublicFunctionprime(pAsInteger)AsBooleanDimkAsIntegerIfp=1ThenExitFunctionElseFork=2ToSqr(p)IfpModk=0ThenExitFunctionNextk(4)EndIfEndFunction第22页,讲稿共77张,创作于星期日2)编程题(2004春上机试卷03)随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最大的素数,并给出它的位置。第23页,讲稿共77张,创作于星期日VB常用算法(四
16、)进制转化常用算法(四)进制转化算法说明算法说明1)十进制正整数m转换为R(216)进制的字符串。思路:将m不断除r取余数,直到商为0,将余数反序即得到结果。算法实现:PrivateFunctionTran(ByValmAsInteger,ByValrAsInteger)AsStringDimStrDtoRAsString,nAsIntegerDoWhilemon=mModrm=mrIfn9ThenStrDtoR=Chr(65+n-10)&StrDtoRElseStrDtoR=n&StrDtoREndIfLoopTran=StrDtoREndFunction第24页,讲稿共77张,创作于星期日
17、2)R(216)进制字符串转换为十进制正整数。思路:R进制数每位数字乘以权值之和即为十进制数。算法实现:PrivateFunctionTran(ByValsAsString,ByValrAsInteger)AsintegerDimnAsInteger,decAsIntegers=UCase(Trim(s)Fori%=1ToLen(s)IfMid(s,i,1)=AThenn=Asc(Mid(s,i,1)-Asc(A)+10Elsen=Val(Mid(s,i,1)EndIfdec=dec+n*r(Len(s)-i)NextiTran=decEndFunction解题技巧解题技巧进制转化的原理要清楚
18、,同时编写代码时候要留意16进制中的AF字符的处理。第25页,讲稿共77张,创作于星期日2、实战练习、实战练习1)补充代码(2002秋二(9)本程序是把给定的二进制整数转换为八进制整数。PrivateSubCommand1_Click()DimaAsString,bAsString,cAsStringDimLAsInteger,mAsInteger,nAsIntegera=InputBox(请输入一个二进制数,输入框)(1)a=String(L,0)&a(2)Form=1Ton/3b=Mid(a,3*m-2,3)(3)NextmText1.Text=cEndSub第26页,讲稿共77张,创作于
19、星期日PrivateFunctionzh(sAsString)AsStringDimiAsInteger,nAsInteger,pAsIntegerp=1Fori=2To0Step-1(4)p=p+1Nextizh=Str(n)EndFunction第27页,讲稿共77张,创作于星期日2)补充代码(2001春二(7)下面程序是把给定的16进制正整数转换为10进制数。OptionExplicitPrivateSubForm_Click()DimStAsInteger,DemAsLongSt=InputBox(输入一个十六进制数)Dem=Convert(St)PrintSt;=;DemEndSub
20、PrivateFunctionConvert(SAsString)AsLongDimNAsInteger,IAsInteger,SubstringAsString*1DimPAslong,KAsLong,Asc1AsIntegerN=(1)P=16NForI=1ToNP=P/16Substring=(2)SelectCaseSubstringCase0To9K=K+P*Val(Substring)Case(3)Asc1=Asc(Substring)-Asc(A)+10(4)EndSelectNextI(5)EndFunction第28页,讲稿共77张,创作于星期日VB常用算法(五)约数因子算法
21、说明算法说明1)最大公约数:最大公约数:用辗转相除法求两自然数用辗转相除法求两自然数m、n的最大公约数。的最大公约数。(1)首先,对于已知两数首先,对于已知两数m、n,比较并使得,比较并使得mn;(2)m除以除以n得余数得余数r;(3)若若r0,则,则n为求得的最大公约数,算法结束;为求得的最大公约数,算法结束;否则执行步骤(否则执行步骤(4)(4)mnnr再重复执行(再重复执行(2)第29页,讲稿共77张,创作于星期日算法实现算法实现循环实现循环实现PrivateFunctionGCD(ByValmAsLong,ByValnAsLong)AsLongDimtempAsLongIfmnThen
22、temp=m:m=n:n=tempDimrAsLongDor=mModnIfr=0ThenExitDom=nn=rLoopGCD=nEndFunction第30页,讲稿共77张,创作于星期日递归实现递归实现PrivateFunctionGCD(ByValmAsLong,ByValnAsLong)AsLongDimtempAsLongIfmnThentemp=m:m=n:n=tempDimrAsLongr=mModnIfr=0ThenGCD=nElsem=nn=rGCD=GCD(m,n)EndIfEndFunction第31页,讲稿共77张,创作于星期日2)最小公倍数最小公倍数mn最大公约数最大
23、公约数3)互质数互质数最大公约数为最大公约数为1的两个正整数的两个正整数解题技巧解题技巧该算法需要识记!该算法需要识记!这种类型题目的扩展是约数和因子题型。这种类型题目的扩展是约数和因子题型。第32页,讲稿共77张,创作于星期日2、实战练习、实战练习1)补充代码(补充代码(2003春二(春二(9)给定一个十进制正整数,找出小于它并与其互质的所有正整数(所谓互质给定一个十进制正整数,找出小于它并与其互质的所有正整数(所谓互质数是指最大公约数为数是指最大公约数为1的两个正整数,下图是程序执行画面)。的两个正整数,下图是程序执行画面)。第33页,讲稿共77张,创作于星期日OptionExplicit
24、PrivateFunctiongcd(1)AsIntegerDimrAsIntegerr=mModnIfr=0Thengcd=nElsem=n:n=r(2)EndIfEndFunctionPrivateSubCommand1_Click()DimnAsInteger,pAsIntegern=Val(Text1)Forp=n-1To2Step-1If(3)ThenList1.AddItempNextpEndSub第34页,讲稿共77张,创作于星期日2)编程题(编程题(2002秋上机试卷秋上机试卷01)生成一个三行八列的二维数组生成一个三行八列的二维数组A(3,8),其中前两行元素,其中前两行元素
25、产生的方法是:产生的方法是:用初值用初值X1=26及公式及公式Xi+1=(25Xi+357)Mod 1024,产生,产生一个数列:一个数列:X1、X2、.、X16。其中其中X1X8作为作为A的第一行元素;的第一行元素;X9X16作为作为A的第二行元的第二行元素;素;A的第三行元素值取前两行同列元素的最大公约数。最后的第三行元素值取前两行同列元素的最大公约数。最后按图示格式显示在图片框中。按图示格式显示在图片框中。第35页,讲稿共77张,创作于星期日VB常用算法(六)排序常用算法(六)排序1、算法说明、算法说明1)选择法排序(1)从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;
26、(2)除第一个数外,在剩下的n-1个数中再按方法(1)选出次小的数,与第二个数交换位置;(3)以此类推,最后构成递增序列。第36页,讲稿共77张,创作于星期日程序代码如下:PrivateSubxzPaiXu(a()AsDouble,shengAsBoolean)a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。DimiAsInteger,jAsIntegerDimtempAsDoubleDimmAsIntegerFori=LBound(a)ToUBound(a)-1进行数组大小-1轮比较m=i在第i轮比较时,假定第 i个元素为最值元素Forj=i+1ToUBou
27、nd(a)在剩下的元素中找出最值元素的下标并记录在m中IfshengThen若为升序,则m记录最小元素下标,否则记录最大元素下标Ifa(j)a(m)Thenm=jEndIfNextj将最值元素与第i个元素交换temp=a(i)a(i)=a(m)a(m)=tempNextiEndSub第37页,讲稿共77张,创作于星期日2)冒泡法排序选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。第38页,讲稿共77张,创作于星期日PrivateSubmpPaiXu(a()AsDou
28、ble,shengAsBoolean)a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。DimiAsInteger,jAsIntegerDimtempAsDoubleDimmAsIntegerFori=LBound(a)ToUBound(a)-1进行n-1轮比较Forj=UBound(a)Toi+1Step-1从n到i个元素两两进行比较IfshengThen若次序不对,马上进行交换Ifa(j)a(j-1)Thentemp=a(j)a(j)=a(j-1)a(j-1)=tempEndIfEndIfNextj出了内循环,一轮排序结束最值元素冒到最上边NextiEndS
29、ub第39页,讲稿共77张,创作于星期日实战练习实战练习1)补充代码(2003秋二(10)下面是一个采用拉锯式排序法对数组元素按升序进行排序的程序,所谓“拉锯式排序法”是这一遍把最小的元素从下到上送到最上的位置,下一遍则是从上到下把最大的元素送到最下的位置。OptionBase1PrivateSubCommand1_Click()Dima(10)AsInteger,iAsIntegerFori=1To10a(i)=Int(Rnd*10)+1Text1=Text1&Str(a(i)NextiCallshaker_sort(a)Fori=1To10Text2=Text2&Str(a(i)Nexti
30、EndSub第40页,讲稿共77张,创作于星期日PrivateSubShaker_sort(k()AsInteger)DimiAsInteger,cAsInteger,dAsIntegerDimtAsIntegerc=1d=(1)DoFor(2)Step-1Ifk(i-1)k(i)Thent=k(i-1):k(i-1)=k(i):k(i)=tEndIfNexti(3)Fori=c+1TodIf(4)Thent=k(i-1):k(i-1)=k(i):k(i)=tEndIfNextid=d-1LoopWhile(5)EndSub第41页,讲稿共77张,创作于星期日2)编程题(2002秋上机试卷04
31、)把文本框输入的字符串按降序添加到列表框中。第42页,讲稿共77张,创作于星期日VB常用算法(七)常用算法(七)数组元素插入删除数组元素插入删除算法说明算法说明数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。基本思路:首先要找到插入位置或要删除的元素。1)插入第43页,讲稿共77张,创作于星期日代码如下:PrivateSubCommand1_Click()Dima(10)AsIntegerDimiAsInteger,kAsIntegerFori=0To9生成数组a(i)=i*3+1Printa(i);NextiPrintPrint插入1
32、4Fork=0To9查找插入14在数组中的位置If14a(k)ThenExitForNextkFori=9TokStep-1从最后元素开始逐个后移,腾出位置a(i+1)=a(i)Nextia(k)=14插入数14Fori=0To10Printa(i);NextiPrintEndSub第44页,讲稿共77张,创作于星期日2)14710131619222528第45页,讲稿共77张,创作于星期日代码如下:Dima()asinteger.ReDima(1ton)Fori=k+1tona(i-1)=a(i)NextIRedimpreservea(1ton-1)第46页,讲稿共77张,创作于星期日实战练
33、习实战练习1)补充代码(2001秋二(8)C盘根目录下文件Data4.txt的内容是:2,4,6,8,10,1,3,5,7,9。下面程序的功能是将文件后半部分的奇数分别按序插入到前半部分的适当位置,得到的新数列是:12345678910。(实现方法:第一次调整后的数列是:12468103579第二次调整后的数列是:12346810579)。第47页,讲稿共77张,创作于星期日OptionExplictPrivateSubForm_Click()DimA(10)AsInteger,iAsInteger,JAsIntegerOpenc:Data4.txtForInputAs#12Do(1)J=J+
34、1Input#12,A(J)LoopCallInsert(A)Fori=1To10PrintA(i);NextiPrintClose#12EndSub第48页,讲稿共77张,创作于星期日PrivateSubInsert(A()AsInteger)DimiAsInteger,PutpAsInteger,JAsIntegerDimGetpAsInteger,NAsInteger,TemAsIntegerN=UBound(A)/2Putp=1Getp=N+1Fori=1ToNTem=A(Getp)ForJ=GetpToPutp+1Step-1(2)NextJA(Putp)=TemGetp=Getp+
35、1Putp=(3)NextiEndSub第49页,讲稿共77张,创作于星期日2)补充代码(2001春二(8)下面程序得功能是将无序数组中相同得数只保留一个,其余得删除,并输出经过删除后的数组元素,删除相同数是通过将该数组元素后面的元素在数组内依次前移替换前一个元素的值实现的。数组各元素的值从文件data.txt中读取。第50页,讲稿共77张,创作于星期日OptionExplictOptionBase1PrivateSubForm_Click()DimIAsInteger,JAsInteger,KAsIntegerDimA()AsInteger,TAsInteger,MAsIntegerOpen
36、c:mydocuments2000testdata.txtForInputAs#1DoWhile(1)I=I+1RedimPreserveA(I)Input#1,A(I)LoopM=1:T=(2)DoWhileMTI=M+1DoWhileIhighThen没有查找到index=-1ExitSubEndIfmid=(low+high)2取查找区间的中点IfKey=a(mid)Then查找到,返回下标index=midExitSubElseIfKeya(mid)Then查找区间在上半部分high=mid-1Elselow=mid+1查找区间在下半部分EndIfCallbirSearch(a,low
37、,high,Key,index)递归调用查找函数EndSub第54页,讲稿共77张,创作于星期日调用方法:PrivateSubCommand1_Click()Dima(11)a(1)=5:a(2)=13:a(3)=19:a(4)=21:a(5)=37a(6)=56:a(7)=64:a(8)=75:a(9)=80:a(10)=88:a(11)=92DimindAsIntegerCallbirSearch(a,LBound(a),UBound(a),21,ind)PrintindEndSub第55页,讲稿共77张,创作于星期日实战练习实战练习补充代码(2002春二(9)C盘根目录下stu.txt文
38、件中以下的格式保存着学生姓名及班号信息。本程序的功能是:读取该文件中的数据,再利用InputvBox输入要查找的学生姓名,通过顺序查找,给出找到或找不到的信息。附图是某同学被找到时显示的信息窗口。张文,机械01李明,机械01王文卉,机械01何宇宙,电子02第56页,讲稿共77张,创作于星期日OptionExplicitOptionBase1PrivateSubForm_click()Dimstu()AsString,glass()AsString,iAsIntegerDimnAsInteger,nameAsString,kAsIntegerOpenc:stustu.txtForInputAs#
39、11DoWhile(1)(2)ReDimPreservestu(n),glass(n)Input#11,stu(n),glass(n)Loopname=InputBox(输入欲查找的学生姓名:)Callsearch(name,stu,k)Ifk=nThenMsgBox(3)ElseMsgBox无此人。EndIfClose#11EndSub第57页,讲稿共77张,创作于星期日PrivateSubsearch(nameAsString,stu()AsString,kAsInteger)DimiAsIntegerFori=1ToUBound(stu)Ifname=stu(i)Then(4)EndIf
40、Nexti(5)EndSub第58页,讲稿共77张,创作于星期日VB常用算法(九)数学应用算法说明算法说明1)初等数学递推法递推法又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都在旧值的基础上递推出新值,并由新值代替旧值。问题:猴子吃桃子小猴子有若干桃子,第一天吃掉一半多一个;第二天吃掉剩下的一半多一个.;如此,到第七天早上要吃时,只剩下一个桃子。问小猴子一开始共有多少桃子?分析:可以最后一天桃子数推出倒数第二天的桃子数;再从倒数第二天推出倒数第三天桃子数.设第n天桃子数为xn,前一天桃子数是:xn1,则有关系:xnxn1/2-1第59页,讲稿共77张,创
41、作于星期日程序如下:PrivateSubCommand1_Click()Dimn%,i%x=1第七天桃子数Print第七天桃子数:1只Fori=6To1Step-1x=(x+1)*2Print第&i&天桃子数:&x&只NextiEndSub第60页,讲稿共77张,创作于星期日穷举法穷举法又称枚举法,即将所有可能情况一一测试,判断是否满足条件,一般用循环实现。问题:百元买鸡问题。假定小鸡每只5角;公鸡每只2元;母鸡每只3元。现在有100元,要求买100只鸡,编程列出所有可能的购鸡方案。分析:设母鸡、公鸡、小鸡分别x、y、z只,则有:xyz1003x2y0.5z100程序一:PrivateSubC
42、ommand1_Click()Dimx%,y%,z%Forx=0To100Fory=0To100Forz=0To100 Ifx+y+z=100And3*x+2*y+0.5*z=100ThenPrintx,y,z EndIfNextzNextyNextxEndSub第61页,讲稿共77张,创作于星期日程序二(优化)PrivateSubCommand1_Click()Dimx%,y%Forx=0To33Fory=0To50If3*x+2*y+0.5*(100-x-y)=100ThenPrintx,y,100-x-yEndIfNextyNextxEndSub第62页,讲稿共77张,创作于星期日2)高
43、等数学求积分求积分 近似计算积分:s=13(x3+2x+5)dx代码如下:PublicFunctionf(ByValx!)被积函数f=x*(x*x+2)+5EndFunction第63页,讲稿共77张,创作于星期日PublicFunctiontrapez(ByVala!,ByValb!,ByValn%)AsSingleb、a分别为积分上下限,n为等分数Dimsum!,h!,x!h=(b-a)/nsum=(f(a)+f(b)/2Fori=1Ton-1x=a+i*hsum=sum+f(x)Nextitrapez=sum*hEndFunction调用:PrivateSubCommand1_Click
44、()Printtrapez(1,3,30)EndSub第64页,讲稿共77张,创作于星期日数论综合题数论综合题此类题目比较广泛,必须给以足够重视。历年题目有:平方数、零巧数、拟互满数、回文数、酉完数、完数、幸运数、逆序数以及无暇素数、超级素数、因子和等。第65页,讲稿共77张,创作于星期日实战练习实战练习1)补充代码(2002秋二(10)找出由两个不同数字组成的平方数,并将结果按图中的格式显示在列表框List1中。第66页,讲稿共77张,创作于星期日OptionExplicitPrivateSubCommand1_Click()DimIAsLong,NAsLongForI=11To300(1)
45、IfVerify(N)Then(2)EndIfNextIEndSub第67页,讲稿共77张,创作于星期日PrivateFunctionVerify((3))AsBooleanDimA(0To9)AsInteger,IAsInteger,JsAsIntegerDoWhileN0(4)N=N10LoopForI=0To9Js=Js+A(I)NextI(5)EndFunction第68页,讲稿共77张,创作于星期日1)编程题(2004秋上机试卷08)一个正整数被称为奇妙平方数,如果此数的平方与它的逆序数的平方互为逆序数。例如,122=144,212=441,12与21互逆,144与441互逆,12就
46、是奇妙平方数。找出1-300以内所有的奇妙平方数。第69页,讲稿共77张,创作于星期日VB常用算法(十)字符处理(统计与加密)算法说明算法说明1)加密解密最简单的加密方法是:将每个字母加一序数,例如5,这时:“A”F”,”a”f”,”B”G”,”b”g”Y”D”,”y”d”,”Z”E”,”z”e”解密是加密的逆操作。界面如下:第70页,讲稿共77张,创作于星期日代码如下:OptionExplicitPrivateSubCommand1_Click()DimstrInput$,Code$,Record$,cAsString*1Dimi%,length%,iAsc%strInput=Text1.T
47、extlength=Len(Trim(strInput)Code=Fori=1Tolengthc=mid(strInput,i,1)SelectCasecCaseAToZiAsc=Asc(c)+5IfiAscAsc(Z)TheniAsc=iAsc-26Code=Code&Chr(iAsc)CaseaToziAsc=Asc(c)+5IfiAscAsc(z)TheniAsc=iAsc-26Code=Code&Chr(iAsc)CaseElseCode=Code&cEndSelectNextiText2.Text=CodeEndSub第71页,讲稿共77张,创作于星期日PrivateSubComma
48、nd3_Click()Text1.Text=Text2.Text=Text3.Text=Text1.SetFocusEndSub第72页,讲稿共77张,创作于星期日2)统计问题提出问题提出统计字符或者数字出现的次数。算法说明算法说明以字符统计为例,设基本问题如下:请统计一段文本中英文字母在文本中出现的次数。(不区分大小写)如:Iamastudent.得到:A:2d:1e:1I:1m:1n:1s:1t:2u:1分析:由于不区分大小写,因此可定义一个大小为26(下标:025)的数组,每个元素依次记录A、B、CZ字母出现的次数。A(0)存放字母a出现的次数A(1)存放字母b出现的次数A(2)存放字母
49、c出现的次数A(3)存放字母d出现的次数譬如:aabdc第73页,讲稿共77张,创作于星期日代码如下:OptionExplicitPrivateSubCommand1_Click()DimiAsInteger,jAsIntegerDimzimu(25)AsIntegerDimallStrAsStringDimaStrAsStringallStr=UCase(Text1.Text)Fori=1ToLen(Text1.Text)aStr=Mid(allStr,i,1)IfaStr=AAndaStr=ZThenzimu(Asc(aStr)-Asc(A)=zimu(Asc(aStr)-Asc(A)+1
50、EndIfNextiFori=0To25Ifzimu(i)0Thenj=j+1Text2.Text=Text2.Text&Chr(i+Asc(A)&:&str(zimu(i)&IfjMod5=0ThenText2.Text=Text2.Text&Chr(13)&Chr(10)EndIfNextiEndSub第74页,讲稿共77张,创作于星期日解题技巧解题技巧熟练运用字符处理函数,对于一些数论题,譬如逆序数等也可将数字通过CStr函数转换为字符后,利用字符处理函数来解题。第75页,讲稿共77张,创作于星期日实战练习实战练习1)补充代码(2003秋二(8)下面程序的功能是统计文件中英文字母(不区分