当前位置:文档之家› 浙大计算机学院考研复试上机试题及参考答案

浙大计算机学院考研复试上机试题及参考答案

浙江大学计算机复试上机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 =three four + five six =zero seven + eight nine =zero + zero =输出样例:39096#include <>#include <>#include <>#include <>int main(void){const char data[12][6] = {"zero", "one","two", "three", "four","five", "six", "seven", "eight", "nine", "+", "="};unsigned a, b; /* 转换后的表达式参数,如a+b(123+456) */unsigned i, j, k; /* 临时变量,作为下标*/ char str[100]; /* 输入字符串,足够大容量*/ char temp[6]; /* 临时字符串,用于检索数字,如"one"->'1' */char result[30]; /* 转换后的表达式参数,如"123+456=" */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<strlen(str); ++i){for(j=0;!isspace(str[i])&&i<strlen(str);++i,++j) /* 提取一个单词 */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同时为零则退出程序 */else printf("%d\n", a + b); /* 打印输出 A + B 的数值 */}while(1);return 0;}2005年浙江大学计算机学院考研复试上机试题及参考答案(2/5)第二题:谁是开门关门的人?(10分)题目要求:每天第一个到机房的人要把门打开,最后一个离开的人要把门关好。

现有一堆杂乱的机房签到、签离记录,请根据记录找出当天开门和关门的人。

输入格式:测试输入的第一行给出记录的总天数N ( > 0 )。

下面列出了N天的记录。

每天的记录在第一行给出记录的条目数M ( > 0 ),下面是M 行,每行的格式为证件号码签到时间签离时间其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。

输出格式:对每一天的记录输出1行,即当天开门和关门人的证件号码,中间用1空格分隔。

注意:在裁判的标准测试输入中,所有记录保证完整,每个人的签到时间在签离时间之前,且没有多人同时签到或者签离的情况。

输入样例:31ME25321 00:00:00 23:59:592EE301218 08:05:35 20:56:35MA301134 12:35:45 21:40:423CS301111 15:30:28 17:00:10SC3021234 08:00:00 11:25:25CS301133 21:45:00 21:58:40输出样例:ME25321 ME25321EE301218 MA301134SC3021234 CS301133#include <>#include <>#include <>typedef struct{char id[16]; /* 证件号码长度不超过15位 */ char cometime[9]; /* 时间格式00:00:00 */ char leavetime[9]; /* 时间格式00:00:00 */ }Record;int main(){int N, M, i; /* 记录的总天数N,每天记录的条目数M */ Record *pTimeList;/* 记录该天出入人员的证件号码、进入时间、离开时间 */int first, last; /* 记录每天开门的人和关门的人 */ scanf("%d",& N); /* 读入记录的总天数 */while(N--){scanf("%d", & M); /* 读入该天的进出人员数 */pTimeList = (Record *)malloc(M*sizeof(Record));for(i=0,first=0,last=0; i<M; ++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;}} /* for i */printf("%s %s\n", pTimeList[first].id,pTimeList[last].id);free(pTimeList);} /* for N */}2005年浙江大学计算机学院考研复试上机试题及参考答案(3/5)第三题:分数统计(12分)题目要求:今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名。

给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。

输入格式:测试输入包含若干场考试的信息。

每场考试信息的第1行给出考生人数N ( 0 < N < 1000 )、考题数M ( 0 < M < = 10)、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。

当读入的考生人数为0时,输入结束,该场考试不予处理。

输出格式:对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。

若有多名考生分数相同,则按他们考号的升序输出。

输入样例:4 5 2510 10 12 13 15CS004 3 5 1 3CS003 5 2 4 1 3 5CS002 2 1 2CS001 3 2 3 51 2 4010 30CS001 1 22 3 2010 10 10CS000000000000000001 0CS000000000000000002 2 1 2输出样例:3CS003 60CS001 37CS004 371CS000000000000000002 20#include <>#include <>#include <>typedef struct{char id[21]; /* 准考证号(<=20字符) */int score; /* 该考生总分*/}StuInfo;int main(){int N, M, G, n; /* 考生人数,题目数,分数线,上线考生数量 */int *pMarkList; /* 第1题至第M题的正整数分值*/StuInfo *pStuinfo; /* 考生信息 */int i,j,k,a,b,c,m; /* 临时变量 */StuInfo tmp; /* 用于排序 */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<M; ++i) /* 读入M题每题分数*/scanf("%d", & (pMarkList[i]) );for(i=0, n=0; i<N; ++i) /* 读入N个考生信息,i用于计数N次,cnt用于计算上线考生记录 */{scanf("%s%d", & (pStuinfo[n].id), &m);/* 准考证号,解出的题目数量m */for(pStuinfo[n].score=0,j=0;j<m; ++j) /* 读入答出的m题的题号 */{scanf("%d", & a );/* 读入答对题的题号 */pStuinfo[n].score += pMarkList[ a-1 ]; /* 因为题号是从1开始的;计算该考生的总分 */}if(pStuinfo[n].score >= G) /* 如果考生上线则记录下来 */n++;/* 否则不予记录,便于排序 */}for(i=0; i<n-1; ++i) /* 输入完毕,对上线考生先按分数排序,降序 */{for(k=i, j=i+1; j<n; ++j)if(pStuinfo[j].score > pStuinfo[k].score)k = j;tmp = pStuinfo[k];pStuinfo[k] = pStuinfo[i];pStuinfo[i] = tmp;}for(i=0; i<n; i+=k) /* 相同总分考生再按照准考证号排序 */{/* 统计相同分数考生人数k */for(k=1,j=i+1; j<n; ++j){if(pStuinfo[i].score == pStuinfo[j].score)k++;elsebreak;}/* 下标i到i+k的考生分数相同,对这k个考生排序,升序 */for(a=i; a<=i+k-1; a++){for(c=a, b=a+1; b<=i+k; b++)if(strcmp(pStui nfo[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<n; ++i) /* 和每个上线考生的准考证号和总分数 */printf("%s %d\n",pStuinfo[i].id ,pStuinfo[i].score);free(pMarkList);free(pStuinfo);}return 0;}2005年浙江大学计算机学院考研复试上机试题及参考答案(4/5)第四题:最大连续子序列(13分)题目要求:给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,Nj },其中 1 <= i <= j <= K。

相关主题