VB常用十大算法Word格式文档下载.docx

上传人:b****6 文档编号:19539219 上传时间:2023-01-07 格式:DOCX 页数:17 大小:200.96KB
下载 相关 举报
VB常用十大算法Word格式文档下载.docx_第1页
第1页 / 共17页
VB常用十大算法Word格式文档下载.docx_第2页
第2页 / 共17页
VB常用十大算法Word格式文档下载.docx_第3页
第3页 / 共17页
VB常用十大算法Word格式文档下载.docx_第4页
第4页 / 共17页
VB常用十大算法Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

VB常用十大算法Word格式文档下载.docx

《VB常用十大算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《VB常用十大算法Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

VB常用十大算法Word格式文档下载.docx

求最小值的方法类同。

求若干数平均值,实质上就是先求和,再除以这些数的个数。

应用举例:

随机产生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);

Print

插入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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1