VB常用算法——素数

合集下载

VB常用算法

VB常用算法

常用算法1.判断素数素数是指只能被1与自己整除的数是素数,最小的素数是2,如3,5,7等都是素数判断方法一:Private Function Prime(N As Integer)As BooleanDim i As IntegerFor i=2 To N-1(或sqr(N)或N\2)If N Mod i=0 Then Exit ForNext i (或N/i=Int(N/i))If i=N Then Prime=TrueEnd Function判断方法二:Private Function Prime(N As Integer)As BooleanDim i As IntegerFor i=2 To N-1If N Mod i=0 Then Exit FunctionNext iPrime=TrueEnd Function(2)求最大公约数(欧几里德算法,辗转相除法)最大公约数是指两个数最大的公约数Private Function Gcd(byval m As Integer,ByVal n As Integer)As Integer Dim r As Integerr=m Mod nDo while r<>0m=nn=rr=m Mod nLoopGcd=nEnd Function利用递归实现判断最大公约数Private Function Gcd(ByVal m As Integer,ByVal n As Integer)As IntegerDim r As Integerr=m Mod nIf r=0 ThenGcd=nELseM=nn=rGcd=Gcd(m,n)End IfEnd Function(3)求因子算法与求完全数算法Private Sub factor(x As Integer,fn()As Integer)'动态数组fn用以存放所有的因子Dim i As Integer,n As IntegerFor i=1 To XIf x Mod i=0 Thenn=n+1Redim Preserve fn(n)fn(n)=iEnd IfNext iEnd Sub求完全数:完全数:整数N的因子和(其中因子包括1,不包括自身)等于NPrirate Function wanshu(N As Integer)As Boolean 'N为原数,sum为N的因子之和Dim i As Integer,sum As IntegerFor i=1 To N-1If N Mod i=0 Thensum=sum+iEnd IfNext iIf sum=N Then wanshu=TrueEnd Function(4)进制转换N进制--十进制如二进制转换为十进制采用从右向左每个数乘以其对应的幂值,如二进制10111=1×2^0+1×2^1+1×2^2+0×2^3+1×2^4=23,八进制转换为十进制采用从右向左每个数乘以其对应的幂值,如八进制25=5×8^0+2×8^1=21,十六进制转换为十进制采用从右向左每个数乘以其对应的幂值, 如十六进制A7=7×16^0+10×16^1=167(十六进制的范围是从0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个数,其中A表示10,B表示11,依次类推,F表示15)private sub zh1(a as string, N as integer,b as integer)'a为N进制数,b为转换后的十进制数,N 代表某种进制dim p as integer,i as integer,s1 as stringp=0for i=Len(a) to 1 step -1s1=Ucase(Mid(a,i,1))if s1>="A" And s1<="F" Then s1=Asc(s1)-55b=b+val(s1)*N^pp=p+1Next IEnd Sub十进制---- N进制:方法是除N逆序取余法,注意逆序如将十进制188转换为十六进制的方法是,除以16逆序取余法, 所以是274余数188/8 4(余数)23/8 7(余数)2/8 2(余数)Private Sub zh(a as integer,N as integer,b as integer)‘a为十进制数,b为转换后的N进制数,N代表某种进制dim r as integer, s as stringdo until a=0r=a mod n ‘r取余if r>9 then s=Chr(55+r) else s=Cstr(r)b=s & ba=a\NLoopEnd Sub(5)互质数:两个数的最大公约数为1Private Function reprime(a as integer, b as integer) as boolean dim i as integerfor i=2 to aif a mod i=0 and b mod i=0 then exit functionnext ireprime=trueEnd Function(6)回文数:左右对称的数为回文数(如121,13231)方法一:折半判断法Private Function compare(n as long) as booleanDim I as integer, s as string , slen as integers=Cstr(n): slen=Len(s)For i=1 to slen\2if mid(s,I,1)<>Mid(s,slen-i+1,1) Then Exit Function nextcompare=trueEnd Function方法二:根据定义:其逆序数(反序数)和原数相等的数为回文数Private Function compare(n as integer) as Booleandim I as integer, s1 as string,s2 as strings1=cstr(n)For i=1 to len(s1)s2=Mid(s1,I,1) & s2Next Iif s2=s1 then compare=trueEnd Function(7)最小公倍数方法一:最小公倍数=两数乘积/最大公约数private Function gcd(byval m as integer, byval n as integer) as integerdim r as integerdor=m mod nm=nn=rloop until r=0gcd=mFunctionprivate Function lcm(x as integer,y as integer) as integerlcm=(x*y/gcd(x,y))End Function方法二:穷举法,利用计算机运算速度快不易出错的特点,将所有的可能性一一尝试,直到得出结果private Function lcm(x as integer, y as integer) as integerdim i as longfor i=1 to x*yif I mod x=0 and I mod y=0 thenlcm=IExit ForEnd Ifnext IEnd Function(8)判断最大数、最小数Private Sub value(a() as integer, max as integer,min as integer)dim i as integermax=a(1) : min=a(1)for i=2 to ubound(a)if a(i)>max then max=a(i)if a(i)<min then min=a(i)next iEnd Sub(9)阶乘方法一: 方法二:利用递归方式private Function Fact(byval N as integer) as Long private Function fact(n as integer) as longFact=1 if n=1 or n=0 thendo while N>0 fact=1fact=fact*N elseN=n-1 fact=n*fact(n-1) loop end ifEnd Function End Function(10)裴波拉挈数列(递推算法)Fab(n)=fab(n-1)+fab(n-2)private Function Fab(n as integer) as integerif n=1 or n=2 thenfab=1elseFab=Fab(n-1)+fab(n-2) ‘函数名=表达式End ifEnd Function(11)排序—从小到大方法一:使用选择排序法private sub sort(a() as integer)dim I as integer, j as integerdim n as integer, t as integern=Ubond(a)for i=1 to n-1for j=i+1 to nif a(i)>a(j) thent=a(i) : a(i)=a(j): a(j)=tend ifnext jnext iEnd Sub方法二:冒泡排序法private sub sort2(a() as integer)dim I as integer,j as integerdim n as integer, t as integern=ubound(a)for i=1 to n-1for j=1 to n-iif a(j)>a(j+1) thent=a(j): a(j)=a(j+1): a(j+1)=tEnd IfNext jNext IEnd Sub(12)分解质因子:如:120=2*2*2*3*5private sub zhiyinzi(n as integer, a() as integer)dim k as integer, i as integeri=2doif n mod i=0 thenk=k+1 : Redim Preserve a(k) : a(k)=i: n=n\i elsei=i+1End Ifloop until n=1End Sub(13)各位数分离Private Sub command1_click() dim i as integer,j as integer i=inputbox("请输入数值") do while i<>0j=i mod 10print ji=i\10loopEnd Sub。

vb程序设计常用算法

vb程序设计常用算法
Print n "=" ? n1 "+" ? n2
Exit For '结束循环
End if
End if
a(imin) = temp
Next I
2.冒泡法排序(升序)
基本思想:(将相邻两个数比较,小的调到前头)
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次
两两相邻比较后,最大的数已"沉底",放在最后一个位置,小数上升"浮起";
2)第二趟对余下的n-1个数(最大的数已"沉底")按上法比较,经n-2次两两相邻比较后得
,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现)
m =val( InputBox("请输入一个数"))
For i=2 To int(sqr(m))
If m Mod i = 0 Then Exit For
Next i
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
Next n1
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。

vb常用算法介绍

vb常用算法介绍

vb常用算法介绍编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(vb常用算法介绍)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为vb常用算法介绍的全部内容。

一、累加算法如果在设计过程中遇到求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可以放在循环体中吗?延伸一下:上述算法对数值型数据,执行的是累加操作,如果对字符串型数据,完成的是字符串的连接。

VB基本算法

VB基本算法

VB基本算法1、判断一个数是不是素数PrivateSubForm_Click()num=Val(InputBo某(\请输入整数num\Fori=2Tonum-1 IfnumModi=0ThenPrint\整数\不是素数\E某itForEndIfNe某tiIfi>num-1ThenPrint\整数\是素数\EndSub2、1~100内素数之和PrivateSubForm_Click()Dimum%um=1Fori=2To100Forj=2Toi-1IfiModj=0ThenE某itForEndIfNe某tjIfj>i-1Thenum=um+i:PrintiNe某tiPrint\以内的素数之和为:\EndSub3、杨辉三角OptionBae1PrivateSubForm_Click()Dima(10,10)Fori=1To10a(i,1)=1a(i,i)=1Ne某tiFori=3To10Forj=2Toi-1a(i,j)=a(i-1,j-1)+a(i-1,j)Ne某tjNe某tiFori=1To10Forj=1ToiPrinta(i,j);\Ne某tjPrintNe某tiEndSub1111...3574、求数列4精确到最后一项的绝对值小于0.0001PrivateSubForm_Click()Dima!,n!n%=1Doa=1/(2某n-1)a=a某(-1)^(n-1)n=n+an=n+1LoopUntilAb(a)<0.0001n=n某4PrintnEndSub5、数组输入输出OptionBae1Dima()PrivateSubForm_Click()n%=Val(InputBo某(\请输入第一维的上界\m%=Val(InputBo某(\请输入第二维的上界\ReDima(n,m)RandomizeFori=1TonForj=1Toma(i,j)=Int(Rnd某100)'或者a(i,j)=Val(InputBo某(\请输入数组元素\Ne某tjNe某tiFori=1TonForj=1TomPrinta(i,j);\\Ne某tjPrintNe某tiEndSub6、数组的转置PrivateSubForm_Click()Dima%(3,4),b%(4,3)Print\转置前:\Fori=1To3Forj=1To4a(i,j)=Int(Rnd某100)Printa(i,j);\\Ne某tjPrintNe某tiFori=1To4Forj=1To3b(i,j)=a(j,i)Ne某tjNe某tiPrintPrint\转置后:\Fori=1To4Forj=1To3Printb(i,j);\\Ne某tjPrintNe某tiEndSub7、数组的插入OptionBae1Dima()'或者a(i,j)=Val(InputBo某(\请输入数组元素\PrivateSubForm_Click()n%=Val(InputBo某(\请输入第一维的上界\ReDima(n)Print\插入前:\Fori=1Tona(i)=Int(Rnd某100)'或者a(i,j)=Val(InputBo某(\请输入数组元素\Printa(i);\\Ne某ticol%=Val(InputBo某(\请输入要插入的位置\num=Val(InputBo某(\请输入要插入的数\ReDimPreervea(n+1)Fori=n+1Tocol+1Step-1a(i)=a(i-1)Ne某tia(col)=numPrintPrint\插入后:\Fori=1Ton+1Printa(i);\\Ne某tiEndSub8、数组元素的删除OptionBae1Dima()PrivateSubForm_Click()n%=Val(InputBo某(\请输入第一维的上界\ReDima(n)Print\删除前:\Fori=1Tona(i)=Int(Rnd某100)'或者a(i,j)=Val(InputBo某(\请输入数组元素\Printa(i);\\Ne某ticol%=Val(InputBo某(\请输入要删除的位置\num=a(col)Fori=colTon-1a(i)=a(i+1)Ne某tia(i)=0PrintPrint\删除后:\Fori=1TonPrinta(i);\\Ne某tiEndSub9、找一列数中最大(最小)的一个数及其下标OptionBae1Dima()PrivateSubForm_Click()n%=Val(InputBo某(\请输入第一维的上界\ReDima(n)Print\原数列:\Fori=1Tona(i)=Int(Rnd某100)'或者a(i,j)=Val(InputBo某(\请输入数组元素\Printa(i);\\Ne某tiMa某=a(1)col=1Fori=2TonIfMa某<a(i)ThenMa某=a(i)col=iEndIfNe某tiPrintPrint\最大的数是:\下标为:\EndSub10冒泡排序对数组a()进行冒泡排序OptionBae1PrivateSubForm_Click()Dima%(10)RandomizeFori=1To10a(i)=Int(Rnd某100)Ne某tiPrint\排序前:\PrintFori=1To10Printa(i);\Ne某tiPrintFori=1To9'冒泡排序Forj=1To10-iIfa(j)>a(j+1)Thent=a(j)a(j)=a(j+1)a(j+1)=tEndIfNe某tjNe某tiPrint\排序后\PrintFori=1To10Printa(i);\Ne某tiEndSub11、数列的逆置OptionBae1PrivateSubForm_Click()Dima%(10)RandomizeFori=1To10a(i)=Int(Rnd某100)Ne某tiPrint\逆置前:\PrintFori=1To10Printa(i);\Ne某tiPrintFori=1To10/2'逆置t=a(i)a(i)=a(10-i+1)a(10-i+1)=tNe某tiPrint\逆置后\PrintFori=1To10Printa(i);\Ne某tiEndSub12、用数组以及传递至的方式进行参数传递编写过程,实现查找一个数列中最大的元素和它所在的位置OptionBae1Dima()PrivateSubf(b%(),ma某%,col%)ma某=b(1)col=1Fori=2ToUBound(b,1)Ifma某<b(i)Thenma某=b(i)col=iEndIfNe某tiEndSubPrivateSubForm_Click()Dimcolumn%,ma某%Dima%(10)Randomize Print\原数列:\Fori=1To10a(i)=Int(Rnd某100)'或者a(i,j)=Val(InputBo某(\请输入数组元素\Printa(i);\\Ne某tiCallf(a(),ma某,column)PrintPrint\最大的数是:\\下标为:\EndSub13、拆分一个整数PrivateSubForm_Click()num%=Val(InputBo某(\请输入待拆分的整数\Print\待拆分的数是\PrintWhilenum<>0某=numMod10Print某;\num=num/10WendEndSub14、拆分一个整数(递归)PrivateSubf(某%)If某<10ThenPrint某;\\ElePrint某Mod10;\\'a%=Int(某/10)f(某\\10)'或者f(a)EndIfEndSubPrivateSubForm_Click()num%=Val(InputBo某(\请输入待拆分的整数\Print\待拆分的数是\PrintfnumEndSub15、阶乘循环法:Fori=1ton=某ne某ti递归法Functionf(n%)ifn=1thenf=1elef=n某f(n-1)EndifEndFunction16、求最大公约数1、循环法PrivateFunctionf(ByVal某%,ByValy%)Dimr%If某<yThent=某某=yy=tEndIfWhiley<>0r=某Mody某=yy=rWendf=某EndFunctionPrivateSubForm_Click()m%=Val(InputBo某(\第一个数是\n%=Val(InputBo某(\第二个数是\Print\输入的两个数是\Printr=f(m,n)Print\最大公约数是\\最小公倍数是\EndSub2、递归法PrivateFunctionf(ByVal某%,ByValy%)Dimr%r=某ModyIfr=0Thenf=yEle某=yy=rf=f(某,y)EndIfEndFunctionPrivateSubForm_Click()m%=Val(InputBo某(\第一个数是\n%=Val(InputBo某(\第二个数是\Print\输入的两个数是\Printr=f(m,n)Print\最大公约数是\\最小公倍数是\EndSub。

VB常见算法

VB常见算法

1. 元素的调整:a(1)= 12 ,a(2)= 2 , a(3)=5 , a(4) =18 t = a(4)For i = 4 to 2step -1a(i) = a(i- 1)a(1)= t2.求a , b两个数的最大公倍数Mn = aDo while n Mod b <> 0n = n + aLoopM = n3.求a , b两个数的最大公约数NDor = a Mod ba = bb = rLoop Until r = 0N = a4.从右向左取一个整数n的各个位数DoK = n Mod 10n = n \ 10S = s & kLoop Until n = 05.求素数For I = 2 To NFor J = 2 To Sqr(I)If I Mod J =0 Then Exit Fora(Idx) = INext INext J6.递归法If i = 1 ThenFact = 1ElseIf i = 2 ThenFact = 2ElseFact = Fact(i - 1)+ Fact(i - 2)7.求一个整数的反序数m = “”D0X = n Mod 10m = m &Xn = n \ 10Loop while n <> 0M = Val(m)8 .判断一个整数n是否为回文数(如404是回文数)Private function judge() as BlooeanCh = Cstr(n )S = Len(Ch)For i = 1 To S/ 2If Mid(Ch , i ,1)<> Mid(Ch ,S - i +1, 1) Then Exit Function Next iHuiwen = TrueEnd function9.求一个不是素数的整数N的因子(除了1 和自身)For I = 1 To N - 1I f N Mod I = 0 ThenS = S & Str(I) ______ I为N的一个因子Next I10.求一个整数p的反序数S = Cstr(p)For i = 1 To Len(s)m = Mid(s, i, 1) & mNext i11取一个范围(m1~m2)内的不重复数i = 1DoN = Int(Rnd(m2-m1+1))+m1For k = 1 To i ............................................. 判断有无重复If rb(k ) = N Then Exit forNext kIf k > ii = i + 1rb(2) = NEnd ifLoop while e12.比较一个整数n中是否有相同的数字Private Function compare(n As Long) As BooleanDim i As Integer, a() As Integer, j As IntegerReDim a(Len(CStr(n)))For i = 1 To Len(CStr(n))a(i) = Mid(n, i, 1)Next iFor i = 1 To UBound(a) - 1For j = 2 To UBound(a)If a(i) = a(j) Then Exit FunctionNext jNext icompare = TrueEnd Function注意:1.回车换行符:S=S&VbCrLf2.InStrr(X, “N”):从X的第一个位置起查找N在X中第一次出现的位置,返回数字。

vb求素数程序

vb求素数程序

需要在窗体放置4个控件,不用设置控件任何属性:Command1,Command2,List1,Label1Dim ctExit As Boolean, ctStop As BooleanDim ctCiFind As Long, ctCiAdd As LongPrivate Sub Form_Load()Me.Caption = "查找 N 以内的所有素数"Label1.Caption = Me.Caption: Label1.AutoSize = TrueCommand1.Caption = "查找": Command2.Caption = "取消"End SubPrivate Sub Form_Resize()Dim S As LongOn Error Resume NextS = Me.TextWidth("A")Command1.Move S, S, S * 8, S * 3Command2.Move S * 10, S, S * 8, S * 3Label1.Move S, Me.ScaleHeight - S * 4, Label1.Width, S * 4List1.Move 0, S * 5, Me.ScaleWidth, Label1.Top - S * 5End SubPrivate Sub Form_Unload(Cancel As Integer)ctExit = True: ctStop = True '保证在查找未结束时能顺利结束程序End SubPrivate Sub Command2_Click()ctStop = True '取消查找End SubPrivate Sub Command1_Click()Static N As LongDim Su() As Long, S As Long, Gen As Long, I As Long, J As LongDim nStr As String, T As Single, Ci As Long'查找 N 以内的所有素数,存入数组 Su(),素数的总个数为 SIf N < 2 Then N = 10000nStr = InputBox("请输入一个大于 1 的整数:", "查找素数", N)If nStr = "" Then Exit SubN = Val(nStr)S = 0: ReDim Su(1)If N > 1 then S = 1: Su(1)=2 '■■根据冰麟轻武的建议,添加了本行ctStop = False: Command1.Enabled = FalseList1.Clear: Label1.Caption = "正在查找 " & N & " 以内的素数 ..."DoEventsT = TimerIf ctCiFind < 10000 Then ctCiFind = 10000'For I = 2 To NFor I = 3 To N Step 2 '■■根据冰麟轻武的建议,将上一行语句改成了本行Gen = Sqr(I) '记忆 I 的平方根For J = 1 To S'进度显示Ci = Ci + 1If Ci > ctCiFind ThenCi = 0: DoEventsIf ctStop Then GoTo Show1Label1.Caption = N & " 以内的素数:" & S & " 个," & Format(I / N * 100, "0.0") & "%"End If'用 I 除以已经找到的素数■■交换下面两行代码,似乎能减少一次Mod 运算If I Mod Su(J) = 0 Then GoTo NextI '能整除,不是素数,检查下一个If Su(J) > Gen Then Exit For '检测到大于 I 的平方根就不用查了。

VB程序设计-素数判断

VB程序设计-素数判断

VB程序设计-素数判断(布局)(运行界面1)(运行界面2)(运行界面3)以下为实测运行通过源代码:Private Sub CommandButton1_Click()Rem 素数判断,算法一Dim n, m As IntegerDim k As Integerm = 0n = Val(Text1.Text) '目标数字If n <= 1 ThenMsgBox "请输入大于1的整数!", vbOKOnly + vbExclamation, "输入错误"Text1.SetFocusText1.Text = "2"Exit SubEnd IfRem 以下是素数判断的算法,适合单个素数的判断For k = 2 To Int(Sqr(n))If n Mod k = 0 Thenm = 1 '标记End IfNext kIf m = 1 ThenText2.Text = n & "不是素数"ElseText2.Text = n & "是素数"End IfEnd SubPrivate Sub CommandButton2_Click()Rem 清空Text1.Text = ""Text2.Text = ""End SubPrivate Sub Commandbutton3_Click()Rem 素数判断,算法二Dim n, k As Integern = Val(Text1.Text)If n <= 1 ThenMsgBox "请输入大于1的整数!", vbOKOnly + vbExclamation, "输入错误"Text1.SetFocusText1.Text = ""Exit SubEnd IfRem 以下是素数判断的算法,也是常用算法,实用性强For k = 2 To Int(Sqr(n))If n Mod k = 0 ThenExit For '可减少不必要的循环End IfNext kIf k > Int(Sqr(n)) ThenText2.Text = n & "是素数" 'k=int(sqr(n))+1ElseText2.Text = n & "不是素数"End IfEnd SubPrivate Sub userForm_Load()Rem 初始化With Label1.FontName = "隶书".FontSize = 30.FontBold = True.ForeColor = vbRedEnd WithLabel1.Caption = "素数判断"Text1.Text = 2Text1.ForeColor = &H80FF&Text2.ForeColor = &H80FF&End SubPrivate Sub Text1_Change()Rem text1的change事件Text2.Text = "请单击判断按钮"End Sub显示窗体按钮代码:Private Sub CommandButton1_Click() UserForm.ShowEnd Sub。

(完整word版)江苏省计算机等级考试二级VB常用算法

(完整word版)江苏省计算机等级考试二级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 = 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应用举例根据下列公式,求自然对数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负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VB常考算法(三)素数:
1、算法说明
所谓素数是指只能被1和它本身整除的数。

1)判断某数是否为素数。

根据循环控制变量来判断。

算法说明:根据素数只能被1和它本身整除的性质,我们可以使用循环依次判断2到n-1(或者Sqr(n))之间有没有被它整除的数,一旦有退出循环,退出循环后通过检验循环变量的值来判断是不是素数。

即,当循环正常退出,循环变量的值等于n时,该数是素数;当循环提前退出,循环变量的值小于等于n-1,该数不是素数。

程序代码如下:
Private Sub Command1_Click()
Dim n As Integer, i As Integer
n = Val(Text1.Text)
If n < 1 Then
MsgBox "请正确输入数据"
Else
n = Val(Text1.Text)
For i = 2 To n - 1
If n Mod i = 0 Then Exit For
Next i
If i = n Then
MsgBox n & "是素数"
Else
MsgBox n & "不是素数"
End If
End If
End Sub
2)判断某数是否为素数。

根据标志位flg来判断。

Private Sub Command1_Click()
Dim n As Integer, i As Integer
Dim flg As Boolean
flg = True
n = Val(Text1.Text)
If n < 1 Then
MsgBox "请正确输入数据"
Else
n = Val(Text1.Text)
For i = 2 To n - 1
If n Mod i = 0 Then flg = False
Next i
If flg = True Then
MsgBox n & "是素数"
Else
MsgBox n & "不是素数"
End If
End If
End Sub
3)使用函数过程。

通过函数返回值来判断。

Private Function isprime(n As Integer) As Boolean
Dim i As Integer
isprime = True
For i = 2 To n - 1
If n Mod i = 0 Then
isprime = False
Exit Function
End If
Next i
End Function
或者
Private Function isprime(n As Integer) As Boolean
Dim i As Integer
isprime = False
For i = 2 To n - 1
If n Mod i = 0 Then
Exit Function
End If
Next i
isprime = True
End Function
2、实战练习
1)完善程序
算法说明:下列程序是查找四位正整数中的超级素数。

所谓超级素数:当一个素数从低位到高位依次去掉一位数后剩下的数仍然是素数,则此数为超级素数。

如数2332、233、23、2均为素数,所以2333为超素数。

Option Explicit
Private Sub Command1_Click()
Dim i As Integer, flg As Boolean
For i = 1001 To 9999 Step 2
Call sup_prime(i, flg)
If flg Then
Debug.Print i
End If
Next i
End Sub
Private Sub sup_prime( (1) , f As Boolean)
Dim p As Integer
f = True
Do While n > 0
If prime(n) Then
(2)
Else
(3)
Exit Sub
End If
Loop
End Sub
Private Function prime(p As Integer) As Boolean
Dim k As Integer
If p = 1 Then
Exit Function
Else
For k = 2 To Sqr(p)
If p Mod k = 0 Then Exit Function
Next k
(4)
End If
End Function
2)编程题
热身:
●如何在文本框中以5个一行的形式显示100~300之间的数值?
●编写程序,输入数据范围m、n,求出介于m、n之间所有的素数,并按每行
五个素数的形式输出到多行文本框中。

实战:
随机生成15个两位正整数,从中找出所有的素数,并记下它是第几个数,再找出其中最大的素数,并给出它的位置。

程序运行界面如图所示:。

相关文档
最新文档