浙大计算机学院考研复试上机试题及参考答案.docx
- 文档编号:14344814
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:44
- 大小:32.18KB
浙大计算机学院考研复试上机试题及参考答案.docx
《浙大计算机学院考研复试上机试题及参考答案.docx》由会员分享,可在线阅读,更多相关《浙大计算机学院考研复试上机试题及参考答案.docx(44页珍藏版)》请在冰点文库上搜索。
浙大计算机学院考研复试上机试题及参考答案
(由林子整理)
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=
输出样例:
90
96
#include<>#include<>#include<>#include<>intmain(void)
{
constchardata[12][6]={"zero","one",
"two","three","four",
"five","six","seven","eight","nine","+",
H_in・
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) 题目要求: 每天第一个到机房的人要把门打开,最后一个离开 的人要把门关好。 现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。 输入格式: 测试输入的第一行给出记录的总天数N(>0)。 下面列出了N天的记录。 每天的记录在第一行给出记录的条目数M(>0),下面是M行,每行的格式为 证件号码签到时间签离时间 其中时间按“小时: 分钟: 秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。 输出格式: 对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。 注意: 在裁判的标准测试输入中,所有记录保证完整,每个人 的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。 输入样例: 3 1 ME2532100: 00: 0023: 59: 59 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() Record*pTimeList;/* 记录该天出入人员的证件号码、进入 时间、离开时间*/ intfirst,last;/* 记录每天开门的人和关门的人*/ scanf("%d",&N);/* 读入记录的总天数*/ while(N--) { { scanf("%d",&M); /*读入该天的进出人员数*/ intN,M,i; /*记录的总天数N,每天记录的条目数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 =10)、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m以及这m道题的题号(题目号由1到M)。 当读入的考生人数为0时,输入结束,该场考试不予处理。 输出格式: 对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。 若有多名考生分数相同,则按他们考号的升序输出。 输入样例: 4525 1010121315 CS0043513 CS003524135 CS002212 CS0013235 1240 1030 CS00112 2320101010CS0000000000000000010CS0000000000000000022120 输出样例: 3 CS00360 CS00137 CS00437 0 1 CS00000000000000000220 #include<> #include<> #include<> typedefstruct { charid[21];/*准考证号(<=20字符)*/ intscore;/*该考生总分*/}StuInfo; intmain() { intN,M,G,n;上线考生数量*/ int*pMarkList;*/ StuInfo*pStuinfo; inti,j,k,a,b,c,m; /*考生人数,题目数,分数线, /*第1题至第M题的正整数分值 /*考生信息*/ /*临时变量*/ StuInfotmp;/*用于排序*/ while(scanf("%d",&N)&&N! =0)/*读入考生人数N*/ { scanf("%d%d",&M,&G);/*读入题目 数量和分数线*/ pMarkList=(int *)malloc(M*sizeof(int));/*M道题目的分数*/ pStuinfo=(StuInfo for(i=0;i /*读入M题每题分数 *)malloc(N*sizeof(StuInfo));/*N个考生*/ */ scanf("%d",&(pMarkList[i])); for(i=0,n=0;i {seanf("%s%d",&(pStuinfo[n].id),&m);/*准考证号,解出的题目数量m*/ for(pStuinfo[n].seore=0,j=0; jvm;++j)/*读入答出的m题的题号*/ {seanf("%d",&a); /*读入答对题的题号*/ pStuinfo[n].seore+= pMarkList[a-1];/*因为题号是从1开始的;计算该考生的总分*/ } if(pStuinfo[n].seore>=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; for(c=a,b=a+1;b<=i+k; if(strcmp(pStui c=b; tmp=pStuinfo[a]; pStuinfo[a]= pStuinfo[c]=tmp; /*排序完毕,按照要求 /*和每个上线考生的 对这k个考生排序,升序*/ for(a=i;a<=i+k-1;a++) { b++) nfo[c].id,pStuinfo[b].id)>0) pStuinfo[c]; } } 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 -10-2 0 输出样例: 201113 1014 1035 101010 0-1-2 000 #include<>#include<>#include<>intmain() { longintK,last;/*输入数据个数K<100Q最大子序 列最后一个元素的下标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行里输出最少还需要建设的道路数目。 输入样例: 13 43 33 12 23 52 12 35 9990 0 输出样例: 1 0 2 998 #include 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«count< } 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) 0",8); if(strlen(ch2) 0",8); 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 85660 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 seanf("%d",&score); for(num=O,i=O;i }while (1); return0; } 2006年浙江大学计算机学院考研复试上机试题及参考答案 (3/5)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 浙大 计算机 学院 考研 复试 上机 试题 参考答案