VB常用十大算法Word格式文档下载.docx
- 文档编号:19539219
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:17
- 大小:200.96KB
VB常用十大算法Word格式文档下载.docx
《VB常用十大算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VB常用十大算法Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例:
随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
Dimn%,i%,min%,max%,aver!
s%
n二Val(lnputBox("
输入个数:
s=Int(Rnd*100)+1
max=s:
min=s:
aver=s
第1个数是:
”&
s
Fori=2Ton
s=Int(Rnd*100)+1
第”&
i&
”个数是:
Ifs>
maxThenmax=s
Ifs<
minThenmin=s
aver=aver+s
aver=aver/n
Print"
max="
max;
"
min二"
;
min;
aver二"
aver
解题技巧:
最大值、最小值、平均值类型题目往往和数组放在一起考!
有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。
3.素数问题
素数(质数):
就是一个大于等于2的整数,并且只能被1和本身整除,而不
能被其他整数整除的数。
判别某数m是否是素数的经典算法是:
对于m,从I=2,3,4,……,m-1依次判别能否被I整除,只要有一个能整除,m就不是素数,否则m是素数。
PrivateFunctionsushu(ByValnAsInteger)AsBoolean
DimiAsInteger
Fori=2Ton-1
If(nModi)=0ThenExitFor
NextI
IfI=nthensushu二True
EndFunction
很显然,实际上,我们可以改进上面
DimiasInteger
Fori=2toInt(Sqr(n))
IfXModi=0ThenExitFunction
sushu=True
这样可以很好的提高效率。
以上判断是否为素数的代码务必识记!
求100-200之内素数。
DimjAsInteger
Forj=100To200
Ifsushu(j)=TrueThen
Printj
EndIf
Nextj
实例说明
编程题:
找出10000以内所有可以表示为两个平方数和的素数。
思路:
首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明
其可以表示为两个平方数之和。
)
判断数I是否为平方数的方法:
Sqr(i)=Int(Sqr(i))
DimjAsInteger,mAsinteger,nAsInteger
Forj=2To10000
Ifpf(j,m,n)二TrueThenListl.Addltemj&
二"
&
m&
+"
&
n
PrivateFunctionpf(ByValshuAsInteger,mAsInteger,nAsInteger)AsBooleanDimiAsLong
Fori=1Toshu-1
If(Sqr(i)=Int(Sqr(i)))And(Sqr(shu-i)=Int(Sqr(shu-i)))Thenpf=Truem=in二shu-i
ExitFunction
Next
4.进制转换
1)十进制正整数m转换为R(2-16)进制的字符串。
将m不断除r取余数,直到商为0,将余数反序即得到结果。
算法实现:
PrivateFunctionTran(ByVaimAsInteger,ByVairAsInteger)AsString
DimStrDtoRAsString,nAsInteger
DoWhilem<
>
o
n二mModr
m=m\r
Ifn>
9Then
StrDtoR=Chr(65+n-10)&
StrDtoR
Else
StrDtoR=n&
Tran二StrDtoR
2)R(2-16)进制字符串转换为十进制正整数。
思路:
R进制数每位数字乘以权值之和即为十进制数。
PrivateFunctionTran(ByVaisAsString,ByVairAsInteger)AsInteger
DimiasInteger,nAsInteger,decAsInteger
s=UCase(Trim(s))
Fori=1ToLen(s)
IfMid(s,i,1)>
="
A"
Then
n二Asc(Mid(s,i,1))-Asc("
)+10
n二Val(Mid(s,i,1))
dec=dec+n*r八(Len(s)-i)
Tran二dec
进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字
符的处理。
算法(五)约数因子--
5.最大公约数、最小公倍数
1)最大公约数:
用辗转相除法求两自然数m、n的最大公约数。
(1)首先,对于已知两数m、n,比较并使得m>
n;
(2)m除以n得余数r;
(3)若r=0,则n为求得的最大公约数,算法结束;
否则执行步骤⑷
(4)
分析步骤:
m二24,n二9
24与9r=mModn二6
20,m=9,n二6r=mModn二3
20,m=6,n二3r=mModn二03为最大公约数。
mnnr再重复执行
(2)
10与5
m=10,n二5
r=mModn二0
所以n(n=5)为最大公约数
算法实现:
循环
PrivateFunctionGCD(ByValmAsLong,ByVainAsLong)AsLongDimtempAsLong,rAsLong
Ifm<
nThentemp=m:
m=n:
n二temp
Do
r=mModn
Ifr=0ThenExitDom=n
n二r
GCD=n
PrivateFunctionGCD(ByValmAsLong,ByVainAsLong)AsLong
DimtempAsLong,rAsLong
Ifr=0Then
m=n
GCD=GCD(m,n)
2)最小公倍数:
mxn眾大公约数
3)互质数:
最大公约数为1的两个正整数
该算法需要识记!
这种类型题目的扩展是约数和因子题型
6.排序
1)选择法排序
(1)从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置;
(2)除第一个数外,在剩下的n-1个数中再按方法
(1)选出次小的数,与第二个数交换位置;
(3)
譬如:
第一轮交换后第二轮交换后第三轮交换后第四轮交换后第五轮无交换
以此类推,最后构成递增序列。
869327
269387
239687
236987
236789
程序代码如下:
PrivateSubxzPaiXu(a()AsDouble,shengAsBoolean)
'
a为需要排序的数组,sheng为True则为升序排列,为False,则为降序排列。
DimiAsInteger,jAsInteger,tempAsDouble,mAsInteger
Fori=LBound(a)ToUBound(a)-1'
进行数组大小-1轮比较
m=i'
在第i轮比较时,假定第i个元素为最值元素
Forj=i+1ToUBound(a)'
在剩下的元素中找出最值元素的下标并赋值给
IfshengThen'
若为升序,则m记录最小元素下标,否则记录最大元素下标Ifa(j)<
a(m)Thenm=j
Ifa(j)>
temp=a(i):
a(i)=a(m):
a(m)=temp'
将最值元素与第i个元素交换
调用该过程示例:
OptionBase1
Dimb(6)AsDouble
b
(1)=8:
b
(2)=6:
b(3)=9:
b(4)=3:
b(5)=2:
b(6)=7
CallxzPaiXu(b,True)
Fori%=1To6
Printb(i)
2)冒泡法排序
选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;
而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。
79
97
68
86
33
2-2
99
88
77
66
程序代码如下:
PrivateSubmpPaiXu(a()AsDouble,shengAsBoolean)
a为需要排序的数组,sheng为True则为升序排列,为False,贝卩为降序排列
DimiAsInteger,jAsInteger,tempAsDouble
进行n-1轮比较
从n到i个元素两两进行比较'
若次序不对,马上进行交换
Fori=LBound(a)ToUBound(a)-1Forj=UBound(a)Toi+1Step-1IfshengThen
Ifa(j)<
a(j-1)Then
temp=a(j):
a(j)=a(j-1):
a(j-1)=tempEndIf
a(j-1)Thentemp=a(j):
a(j-1)=temp
Nextj'
出了内循环,一轮排序结束,最值元素冒到最上边
数组元素插入删除--
7.在数组中插入或删除元素
数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。
基本思路:
首先要找到插入位置或要删除的元素。
1)插入
代码如下:
Dima(10)AsInteger,iAsInteger,kAsInteger
Fori=0To9'
生成数组
a(i)=i*3+1
Printa(i);
插入14"
Fork=0To9'
查找插入14在数组中的位置
If14<
a(k)ThenExitFor
Nextk
Fori=9TokStep-1从最后元素开始逐个后移,腾出位置
a(i+1)=a(i)
a(k)=14插入数14
Fori=0To10
2)删除
14710131619222528
K
io
码如
下:
Dima()asinteger
ReDima(1ton)
Fori=k+1tona(i-1)=a(i)
Redimpreservea(1ton-1)
8.查找
1)顺序查找逐个元素找,如果有,则记录位置,然后跳出循环;
否则,查找失败。
PrivateSubSearch(a(),ByVaiKey,IndexAsInteger)
Dimi%
Fori=LBound(a)ToUBound(a)
Ifa(i)=KeyThen'
找到了,将元素下标保存在index中并结束查找
Index=i
ExitSub
Index=-1'
若没找到,则index值为-1
EndSub2)二分法查找
顺序查找效率低下,当数组有序排列时,可以使用二分法查找提高效率。
代码如下:
PrivateSubbirSearch(a(),ByVallow%,ByValhigh%,ByValKey,index%)
Dima(11),indAsInteger
a
(1)=5:
a
(2)=13:
a(3)=19:
a(4)=21:
a(5)=37
a(6)=56:
a(7)=64:
a(8)=75:
a(9)=80:
a(10)=88:
a(11)=92
CallbirSearch(a,LBound(a),UBound(a),21,ind)
Printind
9.数学表达式
1)初等数学递推法又称为迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。
每次重复都在旧值的基础上递推出新值,并由新值代替旧值。
问题:
猴子吃桃子
小猴子有若干桃子,第一天吃掉一半多一个;
第二天吃掉剩下的一半多一个…..;
如此,到第七天早上要吃时,只剩下一个桃子。
问小猴子一开始共有多少桃子?
分析:
可以最后一天桃子数推出倒数第二天的桃子数;
再从倒数第二天推出倒数第三天桃子数
设第n天桃子数为Xn,前一天桃子数是:
Xn-1,则有关系:
Xn=Xn-1/2-1
程序如下:
Dimn%,i%-
x=1'
第七天桃子数
第七天桃子数:
1只"
Fori=6To1Step-1
x=(x+1)*2Print"
”天桃子数:
x&
”只”
穷举法
又称枚举法,即将所有可能情况一一测试,判断是否满足条件,一般用循环实现。
问题:
百元买鸡问题。
假定小鸡每只5角;
公鸡每只2元;
母鸡每只3元。
现在有100元,要求买100只鸡,编程列出所有可能的购鸡方案。
分析:
设母鸡、公鸡、小鸡分别x、y、z只,则有:
x+y+z=1003x+2y+0.5z=100
程序一:
Dimx%,y%,z%
Forx=0To100
Fory=0To100
Forz=0To100
Ifx+y+z=100And3*x+2*y+0.5*z=100ThenPrintx,y,z
Nextz
Nexty
Nextx
程序二(优化)
Dimx%,y%
Forx=0To33
Fory=0To50
If3*x+2*y+0.5*(100-x-y)=100ThenPrintx,y,100-x-y
2)高等数学求积分
近似计算积分:
s=/13(x3+2x+5)dx代码如下:
PublicFunctionf(ByValx!
)'
被积函数f=x*(x*x+2)+5
PublicFunctiontrapez(ByVala!
ByValb!
ByValn%)AsSingle
b、a分别为积分上下限,n为等分数
Dimsum!
h!
x!
h=(b-a)/n
sum=(f(a)+f(b))/2
Fori=1Ton-1
x=a+i*hsum=sum+f(x)
trapez=sum*h
调用:
Printtrapez(1,3,30)
10.字符串处理
1)加密解密:
最简单的加密方法是:
将每个字母加一序数,例如5,这时:
A—F,a—f,B—G,b宀gY宀D
-”『解密是加密的逆操作。
OptionExplicit
Dimstrlnput$,Code$,Record$,cAsString*1
Dimi%,length%,iAsc%strlnput=Textl.Textlength=Len(Trim(strlnput))
Code="
Fori=1Tolength
c=mid(strlnput,i,1)
SelectCasec
Case"
To"
Z"
iAsc=Asc(c)+5
IfiAsc>
Asc("
)TheniAsc=iAsc-26
Code=Code&
Chr(iAsc)
a"
z"
)TheniAsc=iAsc-26
CaseElse
c
EndSelect
Text2.Text=Code
2)统计:
统计字符或者数字出现的次数。
算法说明:
以字符统计为例,设基本问题如下:
请统计一段文本中英文字母在文本中出现的次数。
(不区分大小写)
如:
Iamastudent.得到:
A:
2d:
1e:
1l:
1m:
1n:
1s:
1t:
2u:
1
由于不区分大小写,因此可定义一个大小为26(下标:
0—25)的数组,
每个元素依次记录A、B、C…Z字母出现的次数。
A(0)存放字母a出现的次数
A
(1)存放字母b出现的次数
a
(2)存放字母c出现的次数
DimiAsInteger,jAsInteger,zimu(25)AsInteger,allStrAsString,aStrAsStringallStr=UCase(Textl.Text)
Fori=1ToLen(Textl.Text)
aStr=Mid(allStr,i,1)
IfaStr>
AndaStr<
zimu(Asc(aStr)-Asc("
))=zimu(Asc(aStr)-Asc("
))+1EndIf
Fori=0To25
Ifzimu(i)<
0Then
j=j+1
Text2.Text=Text2.Text&
C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 常用 算法