算法实例综合复习卷.docx
《算法实例综合复习卷.docx》由会员分享,可在线阅读,更多相关《算法实例综合复习卷.docx(19页珍藏版)》请在冰豆网上搜索。
算法实例综合复习卷
算法实例综合复习卷
枚举算法实例:
枚举法:
列举出问题的所有可能解,并在逐一列举的过程中,检验每个可能解是否是问题的真正解,若是,我们采纳这个解,否则抛弃它。
一一列举,无一遗漏。
在很多时候,实现枚举算法的结构是循环结构嵌套分支结构。
实例1:
在1—1000这些自然数中找寻所有能被37整除的数,累加并输出结果。
PrivateSubForm_Load()
Show
Dimx,sAsInteger
s=0
Forx=1To1000
IfxMod37=0Then
s=s+x
EndIf
Nextx
Prints
EndSub
2、在1~1000这些自然数中算出所有被3和5除都余2的数有几个。
PrivateSubForm_Load()
Dimx,nAsInteger
Show
Print“1~1000之间被3和5除都余2的数:
"
n=0
Forx=1To1000
IfxMod5=2AndxMod3=2Then
n=n+1
EndIf
Nexti
Print"共有"&Str(n)&"个。
"
EndSub
3、若有一个三位数满足:
x=a3+b3+c3(其中a、b、c分别是该三位数的百位、十位和个位数字),则称该三位数为水仙花数。
请编程找出所有的水仙花数。
方法一:
方法一:
PrivateSubForm_Load()
Show
Dimx,a,b,cAsInteger
Forx=100To999
a=x\100
b=(xMod100)\10
c=xMod10
Ifx=a^3+b^3+c^3ThenPrintx
Nextx
EndSub
运行结果:
方法二:
方法二:
PrivateSubForm_Load()
Show
Dima,b,c,xAsInteger
Fora=1To9
Forb=0To9
Forc=0To9
x=a*100+b*10+c
Ifx=a^3+b^3+c^3ThenPrintx
Nextc
Nextb
Nexta
EndSub
4、一张单据上的5位数为1■■47,其中百位数和千位数已经模糊不清了,但直到这个5位数是57或67的倍数,请设计一个算法,输出所有可能的数据,并统计满足要求的数据个数。
5、一张单据上的5位数为1■4■7,其中十位数和千位数已经模糊不清了,但直到这个5位数是57或67的倍数,请设计一个算法,输出所有可能的数据,并统计满足要求的数据个数。
6、包装600个变形金刚,要求是:
包装的规格分别是:
小盒每盒12个,大盒每盒15个。
每种规格的盒数都不能为0。
请设计一个算法,输出所有可能的包装方案。
7、某班举行联欢活动,需要购买本子和笔作为奖品。
本子每本3元,笔每支2元,共有100元,那么本子和笔各买多少支?
(本子至少1本,笔至少1支)流程图略
PrivateSubForm_Load()
Show
Dima,b,c,d,nAsInteger
n=0
Fora=1To33
Forb=1To49
If3*a+2*b=100Then
Printa,b
n=n+1
EndIf
Nextb
Nexta
Print"共有"&Str(n)&"种方法"
EndSub
8、1000以内素数推算
通常我们称自然数n为素数,是指只有1和n本身才能整除它(1不是素数,2是最小的素数),即一个素数除了它本身外,不可能分解为其他自然数的乘积。
设计算法:
¢2~1000依次判断是否为素数,“是”输出并计数,“不是”继续下一个数的判断。
¢一一列举,无一遗漏,所以需要用枚举算法。
¢外层循环:
i的值1~1000
¢内层循环:
j的值2~(i-1),如果i能被j整除,不是素数,跳出内层循环,继续下一个数据的判断。
否则输出该素数。
¢如果需要将找到的素数累加,只要在此程序的基础上加上累加器即可。
方法一:
流程图:
方法一代码:
PrivateSubForm_Load()
Dimi,j,nAsInteger
n=0
Show
Fori=2To1000
Forj=2Toi-1
IfiModj=0Then
ExitFor
EndIf
Nextj
Ifj=iThen
Printi,
n=n+1
IfnMod5=0ThenPrint
EndIf
Nexti
Print
Print"1000以内的素数一共有";n;"个"
EndSub
方法二代码:
代码:
PrivateSubForm_Load()
Dimi,j,nAsInteger
DimbAsString
n=0
Show
Fori=2To1000
b="yes"
Forj=2Toi-1
IfiModj=0Then
b="no"
ExitFor
EndIf
Nextj
Ifb="yes"Then
Printi,
n=n+1
IfnMod5=0ThenPrint
EndIf
Nexti
Print
Print"1000以内的素数一共有";n;"个"
EndSub
方法二流程图:
例:
假设数组D有五个元素,请用冒泡排序的算法,将该数组按升序排列。
冒泡排序:
●是一种直接交换的排序技术。
●把待排序的n个元素的数组看成是垂直堆放的一列数据,从最下面的一个元素起,自下而上地比较相邻的两个元素中的数据,将较小的数换到上面的一个元素中。
重复这一过程,直到处理完最后两个元素中的数据,称为一遍加工。
●当第一遍加工完成时,最小的数据已经上升到第一个元素的位置。
然后对余下的n-1个元素重复上述处理过程,直至最后进行余下两个数据的比较和交换。
二、排序算法
Fori=1To4
Forj=5Toi+1Step-1
Ifd(j)t=d(j)
d(j)=d(j-1)
d(j-1)=t
EndIf
Nextj
Nexti
Print"按从小到大顺序排列的结果为:
"
Fori=1To5
Print"d("&Str(i)&")=";d(i)
Nexti
三、查找算法
1、顺序查找:
在有五个元素的数组中查找数据key。
顺序查找就是在一组数组中,依次查找所需的数据,找到即停止查找并反馈找到的信息,如果找遍还没有找到则反馈没有找到的信息。
方法一:
Fori=1To5
Ifd(i)=keyThen
Print"找到,"&"d("&Str(i)&")="&Str(d(i))
ExitFor'跳出循环语句
EndIf
Nexti
Ifi>5ThenPrint"未找到"
i=1
r=0
DoWhilei<=5Andr=0
Ifd(i)=keyThen
r=i
Else
i=i+1
EndIf
Loop
Ifr<>0Then
Print"找到的数据是:
d("&Str(r)&")"
Else
Print"没找到"
EndIf
方法二:
2、对分查找:
在一个有11个数据升序数组中采用对分查找找寻所需的数据key。
对分查找是在一组有序的数中找到所需结果。
i=1
j=11
DoWhilei<=j
m=Int((i+j)/2)
Ifd(m)=keyThen
Print"查找结果:
找到,d("&Str(m)&")="&Str(d(m))
ExitDo
Else
Ifd(m)i=m+1
Else
j=m-1
EndIf
EndIf
Loop
Ifi>jThenPrint"查找结果:
没找到"
如果数组是降序的,请将判断条件和i和j的变化做相应调整。
y
y