浙大计算机学院考研复试上机试题及参考答案免费.docx
《浙大计算机学院考研复试上机试题及参考答案免费.docx》由会员分享,可在线阅读,更多相关《浙大计算机学院考研复试上机试题及参考答案免费.docx(45页珍藏版)》请在冰点文库上搜索。
浙大计算机学院考研复试上机试题及参考答案免费
浙江大学计算机复试上机2005-2007
(由林子整理)
2005年浙江大学计算机学院考研复试上机试题及参考答案(1/5)
第一题:
A+B(10分)[结题]
题目要求:
读入两个小于100的正整数A和B,计算A+B。
需要注意的是:
A和B的每一位数字由对应的英文单词给出。
输入格式:
测试输入包含若干测试用例,每个测试用例占一行,格式为"A+B=",相邻两字符串有一个空格间隔。
当A和B同时为0时输入结束,相应的结果不要输出。
输出格式:
对每个测试用例输出1行,即A+B的值。
输入样例:
one+two=
threefour+fivesix=
zeroseven+eightnine=
zero+zero=
输出样例:
3
90
96
#include<>
#include<>
#include<>
#include<>
intmain(void)
{
constchardata[12][6]={"zero","one","two","three","four",
"five","six","seven","eight","nine","+","="};
unsigneda,b;/*转换后的表达式参数,如a+b(123+456)*/
unsignedi,j,k;/*临时变量,作为下标*/
charstr[100];/*输入字符串,足够大容量*/
chartemp[6];/*临时字符串,用于检索数字,如"one"->'1'*/
charresult[30];/*转换后的表达式参数,如"123+456="*/
do{
a=b=i=j=k=0;/*初始化变量*/
memset(str,0,sizeof(str));
memset(temp,0,sizeof(temp));
memset(result,0,sizeof(result));
gets(str);/*获取输入字符串,不能使用scanf,因为有空格*/
for(i=0,k=0;i{
for(j=0;!
isspace(str[i])&&itemp[j]=str[i];
temp[j]=0;/*字符串结束标记*/
for(j=0;j<12;j++)/*把这个单词转换为数字*/
if(strcmp(temp,data[j])==0)
{
if(j<=9)result[k++]=j+'0';
if(j==10)result[k++]='+';
if(j==11)result[k++]='=';
break;/*找到匹配数字就不必再搜索了*/
}
}
result[k]=0;/*字符串结束标记,result形式"123+456="*/
sscanf(result,"%d+%d=",&a,&b);/*用sscanf来获得a,b的值*/
if(a==0&&b==0)break;/*A,B同时为零则退出程序*/
elseprintf("%d\n",a+b);/*打印输出A+B的数值*/
}while
(1);
return0;
}
2005年浙江大学计算机学院考研复试上机试题及参考答案(2/5)
第二题:
谁是开门关门的人(10分)
题目要求:
每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。
现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。
输入格式:
测试输入的第一行给出记录的总天数N(>0)。
下面列出了N天的记录。
每天的记录在第一行给出记录的条目数M(>0),下面是M行,每行的格式为
证件号码签到时间签离时间
其中时间按“小时:
分钟:
秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。
输出格式:
对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。
注意:
在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,
且没有多人同时签到或者签离的情况。
输入样例:
3
1
ME2532100:
00:
0023:
59:
59
2
EE30121808:
05:
3520:
56:
35
MA30113412:
35:
4521:
40:
42
3
CS30111115:
30:
2817:
00:
10
SC302123408:
00:
0011:
25:
25
CS30113321:
45:
0021:
58:
40
输出样例:
ME25321ME25321
EE301218MA301134
SC3021234CS301133
#include<>
#include<>
#include<>
typedefstruct
{
charid[16];/*证件号码长度不超过15位*/
charcometime[9];/*时间格式00:
00:
00*/
charleavetime[9];/*时间格式00:
00:
00*/
}Record;
intmain()
{
intN,M,i;/*记录的总天数N,每天记录的条目数M*/
Record*pTimeList;/*记录该天出入人员的证件号码、进入时间、离开时间*/
intfirst,last;/*记录每天开门的人和关门的人*/
scanf("%d",&N);/*读入记录的总天数*/
while(N--)
{
scanf("%d",&M);/*读入该天的进出人员数*/
pTimeList=(Record*)malloc(M*sizeof(Record));
for(i=0,first=0,last=0;i{
scanf("%s%s%s",pTimeList[i].id,pTimeList[i]etime,pTimeList[i].leavetime);
if(i==0)
continue;
else
{
if(strcmp(pTimeList[first]etime,pTimeList[i]etime)>0)
first=i;
if(strcmp(pTimeList[last].leavetime,pTimeList[i].leavetime)<0)
last=i;
}
}/*fori*/
printf("%s%s\n",pTimeList[first].id,pTimeList[last].id);
free(pTimeList);
}/*forN*/
}
2005年浙江大学计算机学院考研复试上机试题及参考答案(3/5)
第三题:
分数统计(12分)
题目要求:
今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。
给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。
输入格式:
测试输入包含若干场考试的信息。
每场考试信息的第1行给出考生人数N(0当读入的考生人数为0时,输入结束,该场考试不予处理。
输出格式:
对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。
若有多名考生分数相同,则按他们考号的升序输出。
输入样例:
4525
1010121315
CS0043513
CS003524135
CS002212
CS0013235
1240
1030
CS00112
2320
101010
CS0000000000000000010
CS000000000000000002212
0
输出样例:
3
CS00360
CS00137
CS00437
0
1
CS00000000000000000220
#include<>
#include<>
#include<>
typedefstruct
{
charid[21];/*准考证号(<=20字符)*/
intscore;/*该考生总分*/
}StuInfo;
intmain()
{
intN,M,G,n;/*考生人数,题目数,分数线,上线考生数量*/
int*pMarkList;/*第1题至第M题的正整数分值*/
StuInfo*pStuinfo;/*考生信息*/
inti,j,k,a,b,c,m;/*临时变量*/
StuInfotmp;/*用于排序*/
while(scanf("%d",&N)&&N!
=0)/*读入考生人数N*/
{
scanf("%d%d",&M,&G);/*读入题目数量和分数线*/
pMarkList=(int*)malloc(M*sizeof(int));/*M道题目的分数*/
pStuinfo=(StuInfo*)malloc(N*sizeof(StuInfo));/*N个考生*/
for(i=0;iscanf("%d",&(pMarkList[i]));
for(i=0,n=0;i{
scanf("%s%d",&(pStuinfo[n].id),&m);/*准考证号,解出的题目数量m*/
for(pStuinfo[n].score=0,j=0;j{
scanf("%d",&a);/*读入答对题的题号*/
pStuinfo[n].score+=pMarkList[a-1];/*因为题号是从1开始的;计算该考生的总分*/
}
if(pStuinfo[n].score>=G)/*如果考生上线则记录下来*/
n++;/*否则不予记录,便于排序*/
}
for(i=0;i{
for(k=i,j=i+1;jif(pStuinfo[j].score>pStuinfo[k].score)
k=j;
tmp=pStuinfo[k];
pStuinfo[k]=pStuinfo[i];
pStuinfo[i]=tmp;
}
for(i=0;i{
/*统计相同分数考生人数k*/
for(k=1,j=i+1;j{
if(pStuinfo[i].score==pStuinfo[j].score)
k++;
else
break;
}
/*下标i到i+k的考生分数相同,对这k个考生排序,升序*/
for(a=i;a<=i+k-1;a++)
{
for(c=a,b=a+1;b<=i+k;b++)
if(strcmp(pStuinfo[c].id,pStuinfo[b].id)>0)
c=b;
tmp=pStuinfo[a];
pStuinfo[a]=pStuinfo[c];
pStuinfo[c]=tmp;
}
}
printf("%d\n",n);/*排序完毕,按照要求输出,上线人数*/
for(i=0;iprintf("%s%d\n",pStuinfo[i].id,pStuinfo[i].score);
free(pMarkList);
free(pStuinfo);
}
return0;
}
2005年浙江大学计算机学院考研复试上机试题及参考答案(4/5)
第四题:
最大连续子序列(13分)
题目要求:
给定K个整数的序列{N1,N2,...,NK},其任意连续子序列可表示为{Ni,Ni+1,...,Nj},其中1<=i<=j<=K。
最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{-2,11,-4,13,-5,-2},其最大连续子序列为{11,-4,13},最大和为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。
输入格式:
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K(<10000),第2行给出K个整数,中间用空格分隔。
当K为0时,输入结束,该用例不被处理。
输出格式:
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。
如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。
若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
输入样例:
6
-211-413-5-2
10
-101234-5-2337-21
6
5-83250
1
10
3
-1-5-2
3
-10-2
0
输出样例:
201113
1014
1035
101010
0-1-2
000
#include<>
#include<>
#include<>
intmain()
{
longintK,last;/*输入数据个数K<1000;最大子序列最后一个元素的下标last*/
longintThisSum,MaxSum,TmpMaxSum,index,*pList;
while(scanf("%d",&K)&&K)
{
ThisSum=0;
MaxSum=TmpMaxSum=last=LONG_MIN;
pList=(longint*)malloc(K*sizeof(longint));
for(index=0;index{
scanf("%d",&(pList[index]));
ThisSum+=pList[index];
if(ThisSum>MaxSum)/*输入含有正数时,忽略最大子序列中首尾0的影响*/
{
MaxSum=ThisSum;/*更新MaxSum*/
if(MaxSum>TmpMaxSum)/*最大值更新时,更新最大子序列最后的数字*/
{/*保证最大子序列起始位置在输入串的最前面*/
TmpMaxSum=MaxSum;
last=index;
}
}
if(ThisSum<0)ThisSum=0;
}
/*tracebacktofindfirstnumberofthemaxsubsequence*/
for(TmpMaxSum=0,index=last;index>=0;index--)
{
TmpMaxSum+=pList[index];
if(TmpMaxSum==MaxSum)
break;
}
if(MaxSum<0)/*K个数字都是负数,定义最大和为0,输出首尾元素*/
printf("%ld%ld%ld\n",0,pList[0],pList[K-1]);
else
printf("%ld%ld%ld\n",MaxSum,pList[index],pList[last]);
free(pList);
}
return0;
}
2005年浙江大学计算机学院考研复试上机试题及参考答案(5/5)
第五题:
畅通工程(15分)
题目要求:
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。
省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。
问最少还需要建设多少条道路
输入格式:
测试输入包含若干测试用例。
每个测试用例的第1行给出两个正整数,分别是城镇数目N(<1000)和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。
为简单起见,城镇从1到N编号。
当N为0时,输入结束,该用例不被处理。
输出格式:
对每个测试用例,在1行里输出最少还需要建设的道路数目。
输入样例:
42
13
43
33
12
23
52
12
35
9990
0
输出样例:
1
0
2
998
#include
#include
usingnamespacestd;
intn,visited[1024];
vector>connect(1024,vector(1024));
intdfs(inta)
{
inti;
visited[a]=1;
for(i=1;i<=n;i++)
if(connect[a][i]==1&&visited[i]==0)
dfs(i);
return(0);
}
intmain(intargc,char*argv[])
{
inti,j,a,b,count=-1;
intnumtown,numroad;
while(cin>>numtown&&numtown!
=0){
cin>>numroad;
n=numtown;
for(i=1;i<=numtown;i++)
for(j=1;j<=numtown;j++)
connect[i][j]=0;
for(i=1;i<=numtown;i++)
visited[i]=0;
for(i=1;i<=numroad;i++)
{
cin>>a>>b;
connect[a][b]=connect[b][a]=1;
}
for(j=1;j<=numtown;j++)
connect[i][j]=0;
for(i=1;i<=numtown;i++)
visited[i]=0;
for(i=1;i<=numroad;i++)
{
cin>>a>>b;
connect[a][b]=connect[b][a]=1;
}
for(i=1;i<=numtown;i++)
if(visited[i]==0)
{
dfs(i);
count++;
}
cout<}
return0;
}
2006年浙江大学计算机学院考研复试上机试题及参考答案(1/5)
第一题:
A+B(16分)
题目要求:
读入两个小于10000的正整数A和B,计算A+B。
需要注意的是:
如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。
输入格式:
测试输入包含若干测试用例,每个测试用例占一行,格式为"ABK",相邻两数字有一个空格间隔。
当A和B同时为0时输入结束,相应的结果不要输出。
输出格式:
对每个测试用例输出1行,即A+B的值或者是-1。
输入样例:
121
11211
10882
36643
001
输出样例:
3
-1
-1
100
#include<>
#include<>
intmain(void)
{
unsignedinta,b,k;
unsignedcharch1[50],ch2[50];
do{
scanf("%d%d%d",&a,&b,&k);
if(a==0&&b==0||k>8)break;
sprintf(ch1,"%d",a);sprintf(ch2,"%d",b);
strrev(ch1);strrev(ch2);
if(strlen(ch1)if(strlen(ch2)if(strncmp(ch1,ch2,k)==0)
printf("%d\n",-1);
else
printf("%d\n",a+b);
}while
(1);
return0;
}
2006年浙江大学计算机学院考研复试上机试题及参考答案(2/5)
2007-03-3121:
44:
14
大中小
第二题:
统计同成绩学生人数(12分)
题目要求:
读入N名学生的成绩,将获得某一给定分数的学生人数输出。
输入格式:
测试输入包含若干测试用例,每个测试用例的格式为
第1行:
N
第2行:
N名学生的成绩,相邻两数字用一个空格间隔。
第3行:
给定分数
当读到N=0时输入结束。
其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。
输出格式:
对每个测试用例,将获得给定分数的学生人数输出。
输入样例:
3
806090
60
2
8566
0
5
6075905575
75
0
输出样例:
1
0
2
#include<>
#include<>
intmain(void)
{
unsignedN,score,num,i;
unsignedpList[1000];
do
{
scanf("%d",&N);
if(N==0)break;
for(i=0;i scanf("%d",&score);
for(num=0,i=0;i printf("%d\n",num);
}while
(1);
return0;
}
2006年浙江大学计算机学院考研复试上机试题及参考答案(3/5)
第三题:
火星A+B(7分)(Z