浙大计算机学院考研复试上机试题及参考答案.docx
- 文档编号:14935896
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:35
- 大小:28.26KB
浙大计算机学院考研复试上机试题及参考答案.docx
《浙大计算机学院考研复试上机试题及参考答案.docx》由会员分享,可在线阅读,更多相关《浙大计算机学院考研复试上机试题及参考答案.docx(35页珍藏版)》请在冰点文库上搜索。
浙大计算机学院考研复试上机试题及参考答案
浙江大学计算机复试上机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])&&i temp[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字符) */ int score; /*该考生总分 */ }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;i scanf("%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;j if(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;i printf("%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 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>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 浙大 计算机 学院 考研 复试 上机 试题 参考答案