vb经典算法.doc
《vb经典算法.doc》由会员分享,可在线阅读,更多相关《vb经典算法.doc(5页珍藏版)》请在冰点文库上搜索。
努力就有收获,人人都能成功!
一·经典算法
⒈编程要求:
公鸡每只5元,母鸡每只3元,小鸡3只1元,请问用100元钱买100只鸡,共有多少种买法?
说明:
百钱百鸡问题其实就是排列组合的问题,解答这种问题需根据题意先确实变量的取值范围,然后使用穷举法求解,一般使用For…Next的循环嵌套结构。
求解本题:
先设可买公鸡x只,母鸡y只,小鸡z只。
取值范围为:
x(0-20),y(0-33),z(0-100)
条件为:
x+y+z=100x*5+y*3+z/3=100
使用多重For…Next循环产生排列组合,再利用if…then单分支语句对每个组合进行判断,即可找到符合条件的买法。
程序中的变量n是计数器。
题库相关试题:
14、15、42、44、56、89、98等。
⒉编程要求:
求四位数以内的水仙花数的个数。
说明:
如果某数的各位数码的立方之和等于这个数,那么就称该数为水仙花数。
例如:
1^3+5^3+3^3=153,所以153为水仙花数。
要解答这样的题目其实就是要掌握从一个整数中分离出其各位数码的方法,或者由各位数码求得该数的方法,因此此类题目一般有两种解法,本例分别使用了两种解法,具体程序参考"帮助"中的"查看源程序"。
从整数中分离各位数码的方法(设n为一个四位数):
求千位:
a=n\1000
求百位:
b=n\100mod10
求十位:
c=n\10mod10
求个位:
d=nmod10
由各位数码合成该数的方法(设千百十个位分别为a,b,c,d):
n=a*1000+b*100+c*10+d
题库相关试题:
10、11、12、18、45、61、62、63、64、76、77、80等。
⒊编程要求:
求100-900之间的所有回文数的个数。
说明:
所谓回文数是从左至右与从右至左读起来都是一样的数字,如:
121是一个回文数。
虽然与水仙花数的定义不同,但是求解方法却十分类似,本题使用数位分离法。
题库相关试题:
168、169、170、173、185等。
⒋编程要求:
统计1000-9999之间的所有满足以下条件的四位数的个数。
该数是一个完全平方数,且其第1位与第3位数字之和为10,第2位与第4位数字之积为12。
本题选自题库230题。
说明:
一个整数是另一个整数的平方,就称称该数是完全平方数,例如:
25=5^2,所以25是完全平方数。
换言之,如果一个数的平方根是整数,那么这个数就是完全平方数。
表达完全平方数的条件写法:
sqr(i)=int(sqr(i))
题库相关试题:
230、232、250、258、260等。
⒌编程:
求出200到500之间所有的完数之和。
本题选自题库139题
说明:
一个数如果刚好与它所有的因子之和相等,则称该数为一个完数。
所谓因子,就是能将该数整除的数,比如6的因子有1,2,3,而6=1+2+3,所以6是一个完数。
解决该类问题的关键是求一个数的所有因子,假设有一数为n,循环用从1-n/2的数去除n,如果能将n整除,则该数为n的因子。
算法如下:
s1=0
fori=1ton/2
ifnmodi=0thens1=s1+i'求因子之和
nexti
题库相关试题:
139、141、143、145、147、202、213、214等。
⒍编程:
求10到200间的所有素数例4-22P95
说明:
素数就是数学当中的质数,判断一个数是不是素数,就是用除了1和它自己以外所有的数去除该数,如果都不能将其整除则该数为素数。
求n是不是素数,就是循环用2-n/2的整数去除n,如果这之间有一个数能将n整除,那么可以确定该数不是素数,用exitfor强制退出循环,如果在整个过程中都没有数能将其整除,则该数是个素数,这时i>n/2。
算法如下:
fori=2ton/2
ifnmodi=0thenexitfor
nexti
ifi>n/2thenprint"该数是一个素数!
"
题库相关试题:
16、39、40、90等。
⒎编程:
求m和n的最大公约数与最小公倍数。
说明:
最大公约数和最小公倍数是大家熟悉的数学问题,在这里分别使用了辗转相除法和穷举法两种算法,源程序请查看"帮助",辗转相除法的具体说明见课本93页,例4-20。
穷举法思路:
假设m大于n,那么m和n的最大公约数不可能大于n,所以循环用从n~1的整数却除m和n,如果能同时将m和n整数,那么该数就是m和n的最大公约数。
算法如下:
fori=nto1step-1
ifmmodi=0andnmodi=0thenexitfor
nexti
'此时的i就是最大公约数。
题库相关试题:
69、70、71、72、74、84等。
⒏编程:
一个数列的第1项为1,第2项为1,从第3项开始,每一项均为前两项之各,求该数列前20项的和。
说明:
裴波那契数问题其实是一种递推问题,由一个数列的前几项求出该数列的后一项。
题库相关试题:
28、231、233、235、237、239、241、243、245、247等。
⒐编程:
计算前n个自然数小于1000的最大和。
例4-21
说明:
求某个数列中符合条件的数的和或者个数。
该种题型的题目很多可以使用计算器或者Excel来求解。
这种题目,由于循环次数未知,因此一般通过do…loop循环来实现,用while或者until来表达终止条件。
题库相关试题:
1、2、5、6、7、8、13、19、21、22、23、24、25、26、27、29、30、31、33、35、36、37、38等。
PublicSubbqbj()
'百钱百鸡
DimxAsInteger,yAsInteger,zAsInteger,nAsInteger
n=0
Forx=0To20
Fory=0To33
z=100-x-y
Ifx*5+y*3+z/3=100Thenn=n+1
Nexty
Nextx
MsgBox"有"&n&"种买法。
",vbOKOnly,"百钱百鸡问题"
EndSub
publicsubshuixiang1()
'水仙花数,从整数分离出各位数码的方法
dimiasinteger,
fori=2to9999'0和1不是水仙花数
a=i\1000'求千位
b=i\100mod10'求百位
c=i\10mod10'求个位
d=imod10
ifa^3+b^3+c^3+d^3=ithenprinti:
n=n+1
nexti
printn
endsub
PublicSubshuixiang2()
'水仙花数,已知各位数码求整数的方法
DimqAsInteger,bAsInteger,sAsInteger,gAsInteger
DimstrAsString,nAsInteger
Forq=0To9
Forb=0To9
Fors=0To9
Forg=0To9
n=q*1000+b*100+s*10+g
Ifq^3+b^3+s^3+g^3=nThenstr=str&n&Space(5)
Nextg
Nexts
Nextb
Nextq
MsgBox"四位数以内的水仙花数有:
"&str
EndSub
PublicSubhws()
'回文数,已知整数分离出各位数码的方法
DimiAsInteger,aAsInteger,bAsInteger,cAsInteger,nAsInteger
n=0
Fori=100To900
a=i\100
b=i\10Mod10
c=iMod10
Ifa=cThenn=n+1
Nexti
MsgBox"100至900之间共有回文数"&i&"个",vbOKOnly,"回文数"
EndSub
PublicSubwqpfs()
'完全平方数
DimiAsInteger,nAsInteger
DimaAsInteger,bAsInteger,cAsInteger,dAsInteger
Fori=1000To9999'1234
a=i\1000
b=i\100Mod10
c=i\10Mod10
d=iMod10
IfInt(Sqr(i))=Sqr(i)Anda+c=10Andb*d=12Thenn=n+1
Nexti
MsgBox"1000到9999之间满足条件的数共有"&n&"个",vbOKOnly,"完全平方数"
EndSub
PublicSubws()
'完数
DimsAsInteger,s1AsInteger,iAsInteger,jAsInteger
s=0
Fori=200To500
s1=0
Forj=1Toi/2
IfiModj=0Thens1=s1+j
Nextj
Ifs1=iThens=s+i
Nexti
MsgBox"200与500之间的完数之和为"&s,vbOKOnly,"完数"
EndSub
PublicSubss()
'素数
DimnAsInteger,iAsInteger,jAsInteger
n=0
Fori=10To200
Forj=2Toi/2
IfiModj=0ThenExitFor
Nextj
Ifj>i/2Then
n=n+1
EndIf
Nexti
MsgBox"10到200间的所有素数共有"&n&"个",vbOKOnly,"素数。
"
EndSub
PublicSubzdgys()
'求最大公约数和最小公倍数,本例使用辗转相除法。
DimmAsInteger,nAsInteger,rAsInteger,tAsInteger
Dimm1AsInteger,n1AsInteger
m=Val(InputBox("请输入第一个整数m"))
n=Val(InputBox("请输入第一个整数n"))
m1=m
n1=n
Ifmm=n:
m=t
Do
r=mModn
m=n
n=r
LoopUntilr=0
MsgBoxm1&"和"&n1&"的最大公约数是:
"&m&Space(4)&"最小公倍数是:
"&m1*n1/m
EndSub
PrivateSubCommand10_Click()
'求最大公约数和最小公倍数,本例使用穷举法。
DimmAsInteger,nAsInteger,rAsInteger,tAsInteger
Dimm1AsInteger,n1AsInteger
m=Val(InputBox("请输入第一个整数m"))
n=Val(InputBox("请输入第一个整数n"))
m1=m
n1=n
Ifmm=n:
t=n
Fori=nTo1Step-1
IfmModi=0AndnModi=0Then
ExitFor
EndIf
Next
MsgBoxm1&"和"&n1&"的最大公约数是:
"&i&Space(4)&"最小公倍数是:
"&m1*n1/i
EndSub
PublicSubpeibo()
'裴波那契数
Dimf1AsInteger,f2AsInteger,sAsInteger
s=0
f1=1
f2=1
'Picture1.Printf1,f2
Fori=1To9
f1=f1+f2
f2=f1+f2
'Picture1.Printf1,f2
s=s+f1+f2
Nexti
MsgBox"裴波那契数列的前20项之和为"&s,vbOKOnly,"裴波那契数"
EndSub
PublicSubqhwt()
'求和问题
DimsAsInteger,iAsInteger
s=0
i=0
DoWhiles<1000
i=i+1
s=s+i
Loop
MsgBox"比1000小的最大和为"&s-i'退出循环时的s一定大于1000,因为多加了一次i,所以要将其减去
EndSub
13
二·程序改错技巧
为了帮助大家更好地解答程序改错题,在这里对程序中经常出现的错误进行了总结:
1、循环条件错误;
2、循环变量修改公式错误,即步长错误;
以上两种错误见下例:
程序功能:
求s=1+3+5+7+...直到s>2000为止。
程序中有两行有错误。
改正错误,使它能输出正确的结果。
源程序:
PrivateSubCommand1_Click()
DimIAsInteger,sAsLong
s=0
I=1
DoUntils<2000
s=s+I
I=I+1
Loop
Prints
EndSub
正确程序:
PrivateSubCommand1_Click()
DimIAsInteger,sAsLong
s=0
I=1
DoUntils>2000'循环条件错误
s=s+I
I=I+2'步长错误
Loop
Prints
EndSub
3、循环语句配套错误;
程序功能:
计算s=2!
+4!
+8!
。
程序中有两行有错误。
改正错误,使它能输出正确的结果。
源程序:
PrivateSubCommand1_Click()
DimkAsInteger,IAsInteger
DimsAsLong,tAsLong
s=0
I=1
DoWhileI<=3
t=1
k=1
Whilek<=2*I
t=t*k
k=k+1
Wend
s=s+t
I=I+1
Wend
Prints
EndSub
正确程序:
PrivateSubCommand1_Click()
DimkAsInteger,IAsInteger
DimsAsLong,tAsLong
s=0
I=1
DoWhileI<=3
t=1
k=1
Whilek<=2^I'循环条件错误。
2的平方
t=t*k
k=k+1
Wend
s=s+t
I=I+1
loop'循环语句配置错误。
Do…Loop,while…wend,for…next
Prints
EndSub
4、选择条件错误:
条件出错或者运算出错,and与or的错误;
程序功能:
求200到400间,能被3整除但不能被7整除的数的个数。
程序中有两行有错误。
改正错误,使它能输出正确的结果。
源程序:
PrivateSubCommand1_Click()
DimcountAsInteger
DimxAsInteger
count=0
x=200
Whilex<=400
IfxMod3=0OrxMod7<>0Then
count=count+1
EndIf
x=x+1
Loop
Printcount
EndSub
正确程序:
PrivateSubCommand1_Click()
DimcountAsInteger
DimxAsInteger
count=0
x=200
Whilex<=400
IfxMod3=0AndxMod7<>0Then'选择条件错误。
or应改为and
count=count+1
EndIf
x=x+1
Wend'循环语句配套错误。
while…wend
Printcount
EndSub
以上例题均选自等级题库的1-5题。
13
5
为了梦想,为了明天,加油!
相信自己一定能行的!
——————凤凰学者