VB常用十大算法.docx
- 文档编号:6525449
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:17
- 大小:200.96KB
VB常用十大算法.docx
《VB常用十大算法.docx》由会员分享,可在线阅读,更多相关《VB常用十大算法.docx(17页珍藏版)》请在冰豆网上搜索。
VB常用十大算法
1.累加与连乘
1、算法说明
[分析]
累加形式:
V=V+e连乘形式:
V=V*e
其中:
V是变量,e是递增表达式。
累加和连乘一般通过循环结构来实现。
注意:
需在执行循环体前对变量V赋初值。
一般累加时置初值0;连乘时置初值为1[举例]求N!
的结果。
PrivateSubCommand1_Click()
Dimn%,i%,s&
n=Val(InputBox("输入n"))
s=1
Fori=1Ton
s=s*i
Nexti
Prints
EndSub
[应用举例]根据下列公式,求自然对数e的的近似值
PrivateSubCommand1_Click()
Dimi%,n&,t!
e!
e=2
i=1
t=1
DoWhilet>0.00001
i=i+1
t=t/ie=e+t
Loop
Print"计算了";i;"项目和是:
";e
PrintExp
(1)
与上句输出值进行对比以证明算法的正确性
EndSub
2.最值问题
1、算法说明
在若干数中求最大值,一般先取第一个数为最大值的初值(即假设第一个数为最大值),然后,在循环体内将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值,直到循环结束。
求最小值的方法类同。
求若干数平均值,实质上就是先求和,再除以这些数的个数。
应用举例:
随机产生n个1-100(包括1和100)的数,求它们的最大值、最小值和平均值。
PrivateSubCommand1_Click()
Dimn%,i%,min%,max%,aver!
s%
n二Val(lnputBox("输入个数:
"))
s=Int(Rnd*100)+1
max=s:
min=s:
aver=s
Print"第1个数是:
”&s
Fori=2Ton
s=Int(Rnd*100)+1
Print"第”&i&”个数是:
”&s
Ifs>maxThenmax=s
Ifs aver=aver+s Nexti aver=aver/n Print"max=";max;"min二";min;"aver二";aver EndSub 解题技巧: 最大值、最小值、平均值类型题目往往和数组放在一起考! 有的不仅求这些值,还要对具有最大值或者最小值的行或列或者某个元素进行处理,这时就要在记录最大、最小值时,同时记录该值所在的行号和列号。 3.素数问题 1、算法说明 素数(质数): 就是一个大于等于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 很显然,实际上,我们可以改进上面 PrivateFunctionsushu(ByValnAsInteger)AsBoolean DimiasInteger Fori=2toInt(Sqr(n)) IfXModi=0ThenExitFunction Nexti sushu=True EndFunction 这样可以很好的提高效率。 以上判断是否为素数的代码务必识记! 应用举例: 求100-200之内素数。 PrivateSubCommand1_Click() DimjAsInteger Forj=100To200 Ifsushu(j)=TrueThen Printj EndIf Nextj EndSub 实例说明 编程题: 找出10000以内所有可以表示为两个平方数和的素数。 思路: 首先找10000以内的所有素数,对于每个素数判断其是否可以表示为两个平方数之和(即对于任意小于该素数shu的数I,如果I和shu-I均为平方数,则说明 其可以表示为两个平方数之和。 ) 判断数I是否为平方数的方法: Sqr(i)=Int(Sqr(i)) PrivateSubCommand1_Click() DimjAsInteger,mAsinteger,nAsInteger Forj=2To10000 Ifsushu(j)=TrueThen Ifpf(j,m,n)二TrueThenListl.Addltemj&"二"&m&"+"&n EndIf EndIf Nextj EndSub 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 EndIf Next EndFunction 4.进制转换 1、算法说明 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&StrDtoR EndIf Loop Tran二StrDtoR EndFunction 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("A")+10 Else n二Val(Mid(s,i,1)) EndIf dec=dec+n*r八(Len(s)-i) Nexti Tran二dec EndFunction 解题技巧: 进制转化的原理要清楚,同时编写代码时候要留意16进制中的A-F字 符的处理。 算法(五)约数因子-- 5.最大公约数、最小公倍数 1、算法说明 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 m=n: n二temp Do r=mModn Ifr=0ThenExitDom=n n二r Loop GCD=n EndFunction PrivateFunctionGCD(ByValmAsLong,ByVainAsLong)AsLong DimtempAsLong,rAsLong Ifm m=n: n二temp r=mModn Ifr=0Then GCD=n Else m=n n二r GCD=GCD(m,n) EndIf EndFunction 2)最小公倍数: mxn眾大公约数 3)互质数: 最大公约数为1的两个正整数 解题技巧: 该算法需要识记! 这种类型题目的扩展是约数和因子题型 6.排序 1、算法说明 1)选择法排序 (1)从n个数中选出最小数的下标,出了循环,将最小数与第一个数交换位置; (2)除第一个数外,在剩下的n-1个数中再按方法 (1)选出次小的数,与第二个数交换位置; (3) 譬如: 第一轮交换后第二轮交换后第三轮交换后第四轮交换后第五轮无交换 以此类推,最后构成递增序列。 869327 269387 239687 236987 236789 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) Else Ifa(j)>a(m)Thenm=j EndIf Nextj temp=a(i): a(i)=a(m): a(m)=temp'将最值元素与第i个元素交换 Nexti EndSub 调用该过程示例: OptionBase1 PrivateSubCommand1_Click() 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) Next EndSub 2)冒泡法排序 选择排序法在每一轮排序时找最值元素的下标,出了内循环(一轮排序结束),再交换最小数的位置;而冒泡法在每一轮排序时将相邻的数比较,当次序不对就交换位置,出了内循环,最值数已经冒出。 79 97 68 86 33 2-2 99 88 77 66 33 2-2 程序代码如下: 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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 常用 算法