R=m-1
else
L=m+1
endif
loop
print"Notfound!
"
sleep:
end
(3)带二分查找的插入排序(已做,需练习)
【程序清单】
DIMASINTEGERn
inputn
DIMASINTEGERa(n),tail,L,R,m
inputa
(1)
fori=2ton
inputx
L=1:
R=i-1:
m=(L+R)\2
Dowhilex<>a(m)and(L<=R)
ifx>a(m)then
L=m+1
else
R=m–1
endif
m=(L+R)\2
loop
ifx<>a(m)then
forj=i-1toLstep-1
a(j+1)=a(j)
nextj
a(L)=x
else
forj=i-1tomstep-1
a(j+1)=a(j)
nextj
a(m)=x
endif
nexti
FORi=1TOn
PRINTa(i);
NEXTi
PRINT
SLEEP:
END
2.报数问题、循环数组
(1)夏令营旗手(JS2010,第一题)(已做)
【问题描述】
2010年江苏省“信息与未来”小学生夏令营将在常州市局前街小学进行,该校的何老师得知本校营员小明同学被营委会选为夏令营的小旗手,就准备到他家去通知他。
由于他不是本班的学生,所以何老师不知道小明家住在什么地方,只从其他同学那里得知,小明住在未来小区一幢不超过100层的高楼中,但在哪一层不清楚。
其他同学提供了三条有用的信息:
1)小明家的楼层号是一个素数;
2)该楼层号化为二进制数后,其中1的个数是偶数;
3)满足以上两个条件中,楼层号最大的一个。
请你写一个程序,计算并输出满足条件(1、2)的楼层个数总数及小明家的楼层号。
【输入】
本题无输入。
【输出】
两个整数,即楼层个数总数和小明家的楼层号。
(2)狐狸找兔子(hide.bas)(已做)
【问题描述】
围绕着山顶有10个洞,一只兔子和一只狐狸各住一个洞,狐狸总想吃掉兔子。
一天,兔子对狐狸说:
你想吃我有一个条件,就是第一次隔一个洞找我,第二次隔两个洞找我,以后依此类推,次数不限。
若能找到我,你就可以饱餐一顿,在没有找到我之前不能停止。
狐狸一想只有10个洞,寻找的次数又不限,哪有找不到的道理,就答应了条件。
结果就是没找着。
现请你编写一个程序,假定狐狸找了1000次,兔子躲在哪个洞里才安全。
(3)循环报数(baoshu.bas)(已做,需练习)
【问题描述】
现有N个人围成一圈(N为输入的数据),按1~M的间隔报数(M也是一个输入的数据)。
根据报数的结果发现,第一个出列的人是1号,第二个出列的人是2号,第三个出列的人是3号,……,最后一个出列的人是N号。
问原来这N个人的排列位置是怎样的?
【输入】
两个整数N和M,表示人数和报数的间隔。
【输出】
一行共N个数,即这N个人原来的排列顺序。
(4)环绕数(round.bas)(已做,需练习)
【问题描述】
一个环绕数有如下三个特点:
a)每个数字指示了它下一个数字的位置(自左向右数,数到末尾后,再绕到最左位往右数);
b)组成这个环绕数的数字只轮到一次;
c)当所有数字都轮过一次后,正好回到第一次开始所取到的那个数字。
例如,3162就是一个环绕数:
●取该数任一数字作为开始,如取1;
●由此数字开始向右数1位,轮到了数字6;
●由6向右数,数到2时绕回到3,再向左数共数6位,就轮到了数字3;
●由3向右数3位,便轮到了数字2;
●由2绕回到3再向右数,共数2位,于是回到1。
【任务】
求以3开头的四位数中,共有几个环绕数,分别为多少?
(5)2N个好人与坏人问题(已做,需练习)
【问题描述】
有N个好人与N个坏人首尾相接地站成一圈(N为输入的一个整数,且前N个人为好人,后N个人为坏人),按照报数间隔M进行1到M地循环报数(即每报到M的人就出列),但M未知。
你的任务是求出一个最小的报数间隔M,使得最先报出的N个人都是坏人。
【输出】
一个整数,表示N。
【输出】
一个整数,即所求出的报数间隔M。
【输入样例】
3
【输出样例】
5
3.排序、新型排序、复杂排序(已做,需练习)
(1)命名那个数字(namenum.bas)
【问题描述】
在威斯康辛州牛大农场经营者之中,都习惯于请会计部门用连续数字给母牛打上烙印。
但是,母牛用手机时并没感到这个系统的便利,它们更喜欢用它们喜欢的名字来呼叫它们的同伴,而不是用像这个的语句“C'mon,#4734,getalong”。
请写一个程序来帮助可怜的牧牛工将一只母牛的烙印编号翻译成一个可能的名字。
因为母牛们现在都有手机了,使用那标准的按键的排布来把收到从数目翻译到文字(除了“Q”和“Z”而外):
2:
A,B,C5:
J,K,L8:
T,U,V
3:
D,E,F6:
M,N,O9:
W,X,Y
4:
G,H,I7:
P,R,S
可接受的名字都被放在这样一个叫作"dict.txt"的文件中,它包含一连串的少于5000个可接受的牛名字(所有的名字都是大写的)。
收到母牛的编号返回那些能从编号翻译出来并且在字典中的名字。
举例来说,编号4734能产生的下列各项名字:
GPDGGPDHGPDIGPEGGPEHGPEIGPFGGPFHGPFIGRDGGRDHGRDI
GREGGREHGREIGRFGGRFHGRFIGSDGGSDHGSDIGSEGGSEHGSEI
GSFGGSFHGSFIHPDGHPDHHPDIHPEGHPEHHPEIHPFGHPFHHPFI
HRDGHRDHHRDIHREGHREHHREIHRFGHRFHHRFIHSDGHSDHHSDI
HSEGHSEHHSEIHSFGHSFHHSFIIPDGIPDHIPDIIPEGIPEHIPEI
IPFGIPFHIPFIIRDGIRDHIRDIIREGIREHIREIIRFGIRFHIRFI
ISDGISDHISDIISEGISEHISEIISFGISFHISFI
碰巧,81个中只有一个“GREG”是有效的(在字典中)。
现在,请你写一个程序来对给出的编号打印出所有的有效名字,如果没有则输出“NONE”。
编号可能有12位数字。
【输入】(namenum.in)
单独的一行包含一个编号(长度可能从1到12)。
【输出】(namenum.out)
以字典顺序输出一个有效名字的不负列表,一行一个名字。
【样例输入】
4734
【样例输出】
GREG
(2)分数线划定(score.bas)(已做,需练习)
【问题描述】
世博会志愿者的选拔工作正在A市如火如荼地进行。
为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。
面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
【输入】
输入文件名为score.in。
第一行,两个整数n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其中n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数。
输入数据保证m*150%向下取整后小于等于n。
第二行到第n+1行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000≤k≤9999)和该选手的笔试成绩s(1≤s≤100)。
数据保证选手的报名号各不相同。
【输出】
输出文件score.out。
第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。
从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
【输入输出样例】
score.in
score.out
63
100090
323988
239095
723184
100595
100188
885
100595
239095
100090
100188
323988
【样例说明】
m*150%=3*150%=4.5,向下取整后为4。
保证4个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88的选手都可以进入面试,故最终有5个人进入面试。
(3)三值排序(sort3.bas)(已做,需练习)
【问题描述】
同学们已经学过若干种排序方法,也解过不少有关排序的问题。
现在,我们来看一种三值排序问题,即给你一个数字序列,该序列中只有三种不同的值。
这种序列在我们日常生活中也能见到,例如,当我们给某项竞赛的优胜者按金银铜牌排序的时候,就会出现这样的序列。
在我们这个任务中,可能的值只有三种:
1,2和3。
我们用交换的方法,把它们排成升序序列。
现在,请你写一个程序,计算出当给定一个长度为N的、由1、2、3组成的数字序列后,将该序列排成升序所需要的最少交换次数。
【输入】
键盘输入:
第一行是一个整数,表示N(1<=N<=1000);
接下来的第二行到N+1行,每行输入一个1到3之间的整数。
【输出】
屏幕输出一个数字,表示排成升序所需要的最少交换次数。
【样例输入】
9
2
2
1
3
3
3
2
3
1
【样例输出】
4
4.字符串(已做,需练习)
(1)分离单词——要求从文件中读入英文句子或段落,再分离单词。
5.数位分离、进制转换(已做,需练习)
(1)将二进制数化为十进制数,包含小数。
(2)将十进制数化为二进制数,包含小数。
(3)如果一个十进制数是回文数,把它转换成二进制数后仍为回文数,这个数称为绝对回文数。
找出[11,500]以内的绝对回文数。
(4)求最大公约数与最小公倍数(已做)
【问题描述】
输入二个二进制整数(长度不超过20位),求出其最大公约数与最小公倍数,并用二进制数输出。
例如:
输入:
11,100输出:
11100
【输入】
两个二进制数。
【输出】
用二进制数表示的最大公约数与最小公倍数
(4)进制数(已做)
【问题描述】
给出一个正整数N(1〈=N〈=1023),将其化为10位二进制数,然后计算出二进制数中的“1”的个数,若1的个数为奇数,则在最高位前加一个1,否则加一个0,最后将在此基础上形成一个11位二进制数,用3个十六进制数输出。
例如:
输入23,化为二进制数为:
0000010111,因为1的个数为4,在最高位前加0,得到00000010111。
输出:
0H,1H,7H
再如:
输入453,化为二进制数为:
0111000101,因为1的个数是奇数,所以在最高位前加1,得到10111000101。
输出:
5H,CH,5H
【输入格式】
键盘输入。
一个正整数N。
【输出格式】
根据形成的11位二进制数,用3个十六进制数输出。
【样例】
输入:
453输出:
5H,CH,5H
(5)数列(sequence.bas)(已做)
【问题描述】
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…
(该序列实际上就是:
30,31,30+31,32,30+32,31+32,30+31+32,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
【输入文件】
输入文件sequence.in只有1行,为两个正整数k和N(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
【输出文件】
输出文件sequence.out为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。
(整数前不要有空格和其他符号)。
【输入样例】
3,100
【输出样例】
981
(6)海明码(hamming.bas)
【问题描述】
给出N,B和D:
找出N个编码(1<=N<=64),每个编码有B位(1<=B<=8),使得两两编码之间至少有D个单位的“海明距离”(1<=D<=7)。
“海明距离”是指对于两个编码,他们的二进制表示法中的不同二进制位的数目。
看下面的两个编码0x554和0x234之间的区别(0x554表示一个十六进制数,每个位上分别是5,5,4):
0x554=010101010100
0x234=001000110100
不同的二进制位:
xxxxx
因为有五个位不同,所以“海明距离”是5。
【输入】
输入文件名为hamming.in,文件中只有一行,包括N,B,D。
【输出】
输出文件名为hamming.out,其中共有N个编码(用十进制表示),要排序,十个一行。
如果有多解,你的程序要输出这样的解:
假如把它化为2^B进制的数,它的值要最小。
【样例输入】
16,7,3
【样例输出】
072530424551527576
828597102120127
6.进制穷举、复杂穷举、穷举的优化
(1)丑数(humble.bas)(已做,需练习)()
【问题描述】
对于一个给定的素数集合S={p1,p2,...,pK}(也就是说,p1、p2、……、pk都是给定的素数),考虑那些质因数全部属于S的数的集合——这个集合中的数包括:
p1,p1*p2,p1*p1,p1*p2*p3,……。
称由这些数构成的集合为相应S的丑数集合。
注意:
规定1不是丑数。
你的任务是对于输入的集合S,去寻找丑数集合中第N个丑数。
【输入】(humble.in)
第1行:
两个由空格隔开的整数K和N,此处1<=K<=100,1<=N<=100,000;
第2行:
K个由空格隔开的整数,它们都是集合S的元素。
【输出】(humble.out)
一行,输出第N个丑数。
【输入样例】
419
2357
【输出样例】
27
7.生成法求全排列(已做,需练习)
【程序清单】
DIMASINTEGERN,I,S
INPUTN
DIMASINTEGERA(n)
FORI=1TON
A(i)=I
NEXTI
DO
S=S+1
FORI=1TON
PRINTA(i);
NEXTI
PRINT
FORI=NTO2STEP-1
IFA(i-1)EXITFOR
NEXTI
IFI=1THENEXITDO
I=N
DO
IFA(i)>A(m)THENSWAPA(i),A(m):
EXITDO
I=I-1
LOOP
I=M+1
J=N
DO
SWAPA(i),A(j)
I=I+1
J=J-1
LOOPUNTILI>=J
LOOP
PRINTS
SLEEP:
END
8.组合取数(已做,需练习)
【程序清单】
DIMASINTEGERN,R,S,I,J
INPUTN,R
DimASINTEGERb(r)
S=0
FORI=0TOR‘产生初始的、也是第一种排列
B(I)=I
NEXTI
DOWHILEB(0)=0
S=S+1
FORI=1TOR‘打印当前这一组组合的排列情况
PRINTB(I);“”;
NEXTI
PRINT
J=R
DOWHILEB(J)=N–R+J‘若允许R=N,则要改一下条件,否则会出现问题
J=J-1
LOOP
B(J)=B(J)+1
FORI=J+1TOR
B(I)=B(I-1)+1
NEXTI
LOOP
PRINT“S=”;S
SLEEP:
END
9.递推迭代深入
(1)求数组元素(已做)
已知给出任意一个自然数(N<=100),输出满足下列条件的数组元素及不同方案数,条件是:
1)数组元素由各不相同的自然数组成;
2)最后一个元素必为N;
3)每一个元素都不小于它前面一个元素的平方(第一个元素除外);
4)数组中包含的元素个数可以不相同,但至少要有一个元素;
例如:
输入:
N=1
输出:
数组:
(1)
K=1‘用K记录不同的方案数
又如:
N=5
数组:
(5),(1,2,5),(1,5),(2,5)
K=4
(2)回文数列(已做,需练习)
【问题描述】
对一个正整数K,求出K的所有拆分,并统计输出其中回文数列的个数。
所谓回文数列是指该数列中的所有数字,从左向右或从右向左看都相同。
例如,K=4时,有如下的拆分:
4=1+1+1+1{回文数列1}
=1+1+2
=1+2+1{回文数列2}
=2+1+1
=2+2{回文数列3}
=1+3
=3+1
因此,回文数列共有3个。
【输入】
一个正整数K(1【输出】
满足条件的回文数列的个数。
【输入样例】
4
【输出样例】
3
(3)排序集合(sort.bas)(已做,需练习)
【问题描述】
对于集合N={1,2,…,N}的子集,定义一个称为“小于”的关系:
设S1={X1,X2,…,Xi},(X1你的任务是:
对于任意的n(n<=31)及k(k<2n),求出第k小的子集。
【输入】(sort.in)
输入文件仅一行,包含两个用空格隔开的自然数,n和k。
【输出】(sort.out)
输出文件仅一行,是该子集的元素,由小到大排列。
空集输出0。
【输入输出样例】
sort.in:
34
sort.out:
123
10.图形打印
(1)螺旋方阵(JS2010,T5,10分)(已做)
【问题描述】
输入一个正整数N(1<=N<=20)后,可以得到一个N*N的数字螺旋方阵,分别求该方阵中的主对角线与副对角线上的数字之和S、P,输出S、P的差。
例如:
N=5,得到的数字螺旋方阵如下:
1
2
3
4
5
16
17
18
19
6
15
24
25
20
7
14
23
22
21
8
13
12
11
10
9
其中,主对角线从左上角到右下角,得到的数字之和为:
S=1+17+25+21+9=73;副对角线从右上到左下,得到的数字之和:
P=5+19+25+23+13=85,S-P=-12。
【输入】
一个整数N。
【输出】
主对角线与副对角线上数字和的差。
【样例】
见问题中的举例。
11.高精度计算
(1)印度国王的棋盘(JS2010,T3,10分)(已做,需练习)
【问题描述】
印度国王使用的棋盘有N*N个格子(N无限大),现在从第一个格子开始放麦粒,第一个格子放1粒,第二个格子放2粒,第三个格子放4粒,……,第N个格子放2^(N-1)粒麦粒。
请你编程计算从第K格至第M格共有多少粒麦粒。
【输入】
一行,两个整数K,M(4<=K【输出】
共有多少粒麦粒(结果不超过6位时,直接输出结果;结果超过6位时,只输出结果的最高3位和最低3位,以逗号分隔)。
12.数学类问题(数论问题)
(1)数学作业(math.bas)(已做)
【问题描述】
小明的数学老师布置了一堆数学题作为作业,这些数学题有一个共同的特点,就是都是要求计算出C(N,M)中不同质因子的个数。
Steven请你帮他写一个程序,来帮助他尽快地完成这些作业。
C(N,M)即求在N个数中选M个数的组合数。
【输入格式】(math.in)
输入文件中只有一行,其中有两