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负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。
通常是用:if通项表达式>10^(-N)then exit do,注意这句话一般需放在累加或者连乘式之前。
实例说明根据X值计算:要求:n项绝对值小于等于10-6为止。
1、由于循环次数不确定,因此确定用Do循环结构并定义循环变量用n表示(初值1);用户输入的值用x表示;通项用dblCos表示;累加值用sum表示,初值为0;2、分解通项式的组成于是有:private Function comp(n as long)as longdim I as longdim result as longresult=1‘此处注意,由于是连乘,初值为1for I=1to2*(n-1)result=result*Inext Icomp=resultEnd Function注意:由于是参数按地址传递,因此对于本题,实参的值不能在过程中被改变!(也是改错题常考的地方!!)4、根据步骤1、2、3,写出通项dblCos的表达式:dblCos=(-1)^(n+1)*x^(2*(n-1))/comp(n)5、根据精度要求知:If abs(dblCos)<=10^(-6)then exit do最后程序为:Private Sub Command1_Click()Dim n As Long,dblCos As Double,x As Doublex=Val(Text1.Text)n=1DodblCos=(-1)^(n+1)*x^(2*(n-1))/comp(n)If Abs(dblCos)<=10^(-6)Then Exit DoSum=Sum+dblCosn=n+1LoopPrint SumEnd SubPrivate Function comp(n As Long)As LongDim I As LongDim result As Longresult=1'此处注意,由于是连乘,初值为1For I=1To2*(n-1)result=result*INext Icomp=resultEnd Function常用算法(2):最值问题算法说明:在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。
(求最小值的方法类同。
)求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
Private Sub Command1_Click()Dim n As Integer,i As Integer,min As Integer,max As Integer,aver As Single,s As Integer n=Val(InputBox("输入个数:"))s=Int(Rnd*100)+1max=smin=saver=sPrint"第1个数是:"&sFor i=2To 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解题技巧:最大值、最小值、平均值类型题目往往和数组放在一起考!有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。
常用算法(3):素数1、算法说明素数(质数):就是一个大于等于2的整数,并且只能被1和本身整除,而不能被其他整数整除的数。
判别某数m是否是素数的经典算法是:对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。
Private Function sushu(ByVal n As Long)As BooleanDim i As LongFor i=2To n-1If(n Mod i)=0Then Exit ForNext IIf I=n then sushu=TrueEnd Function很显然,实际上,我们可以改进上面For i=2To n–1为:For i=2To int(sqr(m))这样可以很好的提高效率。
以上判断是否为素数的代码务必识记!应用举例求100-200之内素数。
Private Sub Command1_Click()Dim j As IntegerFor j=100To200If sushu(j)=True ThenPrint jEnd IfNext jEnd Sub解题技巧识记判断素数的算法过程,根据题意,灵活调用!实例说明编程题(2002年春上机试卷04)找出10000以内所有可以表示为两个平方数和的素数。
思路:首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明其可以表示为两个平方数之和。
)判断数I是否为平方数的方法:sqr(i)=int(sqr(i))Private Sub Command1_Click()Dim j As IntegerDim m As Long,n As LongFor j=2To10000If sushu(j)=True ThenIf pf(j,m,n)=True ThenList1.AddItem j&"="&m&"+"&nEnd IfEnd IfNext jEnd SubPrivate Function pf(ByVal shu As Long,m As Long,n As Long)As BooleanDim i As LongFor i=1To shu-1If(Sqr(i)=Int(Sqr(i)))And(Sqr(shu-i)=Int(Sqr(shu-i)))Thenpf=Truem=in=shu-iExit FunctionEnd IfNextEnd Function常用算法(4):进制转化1、算法说明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>9ThenStrDtoR=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%=1To Len(s)If Mid(s,i,1)>="A"Thenn=Asc(Mid(s,i,1))-Asc("A")+10Elsen=Val(Mid(s,i,1))End Ifdec=dec+n*r^(Len(s)-i)Next iTran=decEnd Function常用算法(5):约数因子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=10n=5r=m mod n=0所以n(n=5)为最大公约数24与9分析步骤:m=24n=9r=m mod n=6r≠0m=9n=6r=m mod n=3r≠0m=6n=3r=m mod n=0所以n(n=3)为最大公约数算法实现1、循环实现Private Function GCD(ByVal m As Long,ByVal n As Long)As Long Dim temp As LongIf m<n Then temp=m:m=n:n=tempDim r As LongDor=m Mod nIf r=0Then Exit Dom=nn=rLoopGCD=nEnd Function2、递归实现Private Function GCD(ByVal m As Long,ByVal n As Long)As Long Dim temp As LongIf m<n Then temp=m:m=n:n=tempDim r As Longr=m Mod nIf r=0ThenGCD=nElsem=nn=rGCD=GCD(m,n)End IfEnd Function2)最小公倍数m×n÷最大公约数3)互质数最大公约数为1的两个正整数解题技巧该算法需要识记!这种类型题目的扩展是约数和因子题型。