关键词不能为空

当前您在: 主页 > 英语 >

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

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-18 21:38
tags:

-

2021年2月18日发(作者:你完了)


浙江大学计算机复试上机


2005-2007


(由林子整理



QQ



170479150




?



2005< /p>


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


(1/5)




第一题:


A+B(10



) [


结题


]



题 目要求:读入两个小于


100


的正整数


A



B


,计算


A+B




需要注意的是:

< p>
A



B


的每一位数字由对 应的英文单词给出。



输入格式:


测试 输入包含若干测试用例,


每个测试用例占一行,


格式为



,相邻两字符串有一个空格间隔。当


A



B


同时为


0


时输入结束,相应的结果不要输出。



输出格式 :对每个测试用例输出


1


行,即


A+B


的值。



输入样例:



one + two =


three four + five six =


zero seven + eight nine =


zero + zero =



输出样例:



3


90


96



#include


#include


#include


#include



int main(void)


{


const char data[12][6] = {










unsigned a, b; /*


转换后的表达式参数


,



a+b(123+456) */


unsigned i, j, k; /*


临时变量,作为下标


*/


char str[100]; /*


输入字符串,足够大容量


*/


char temp[6]; /*


临时字符串,用于检索数字,如



char result[30]; /*


转换后的表达式参数,如




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


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


形式




sscanf(result,



sscanf


来获得


a,b


的值


*/


if( a==0 && b==0 ) break; /* A,B


同时为零则


退出程序


*/


else


printf(


a


+


b); /*


打印输出


A


+


B


的数值


*/


}while(1);



return 0;


}






?



2005


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


(2/5)




第 二题:谁是开门关门的人?(


10


分)



题目要求:每天第一个到机房的人要把门打开,最后一个离开


的 人要把门关好。现有一堆杂乱的机房签到、签离记录,请根


据记录找出当天开门和关门的 人。



输入格式:测试输入的第一行给出记录的总天数


N ( > 0 )



下面列出了


N

天的记录。



每天的记录在第一行给出记录的条目数


M ( > 0 )


,下面是


M


行,每行的格式为




证件号码



签到时间



签离时间



其中时间按“小时


:


分钟


:


秒钟”(各占


2


位)给出,证件号码


是长度不超过< /p>


15


的字符串。



输出格式:对每一天的记录输出


1


行,即当天开门和关门人的


证件号码,中间用


1


空格分隔。



注意:在裁判的标准测试输入中,所有记录保证完整,每个人


的签到时间在签离时间之前,



且没有多人同时签到或者签离的情况。



输入样例:



3


1


ME3 00:00:00 23:59:59


2


EE301218 08:05:35 20:56:35


MA301134 12:35:45 21:40:42


3


CS301111 15:30:28 17:00:10


SC3021234 08:00:00 11:25:25


CS301133 21:45:00 21:58:40



输出样例:



ME3 ME3


EE301218 MA301134


SC3021234 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;/*


记录该天出入人员的证件号码、


进入时间、离开时间

< br> */


int first, last; /*


记录每天开门的人和关门的人


*/



scanf(


读入记录的总天数


*/


while(N--)


{


scanf(


读入该天的进出人员数


*/


pTimeList = (Record


*)malloc(M*sizeof(Record));



for(i=0,first=0,last=0; i


{


scanf(


pTimeList[i].cometime,


pTimeList[i].leavetime);


if(i==0)


continue;


else


{


if( strcmp( pTimeList[first].cometime,


pTimeList[i].cometime ) > 0 )


first = i;


if( strcmp( pTimeList[last].leavetime,


pTimeList[i].leavetime) < 0)


last = i;


}


} /* for i */



printf(


pTimeList[last].id);


free(pTimeList);


} /* for N */


}






?



200 5


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


(3/5 )




第三题:分数统计(


12


分)



题目要求: 今天的上机考试虽然有实时的


Ranklist


,但上面


的排名只是根据完成的题数排序,没有考虑每题的分值,所以


并不是最 后的排名。给定录取分数线,请你写程序找出最后通


过分数线的考生,并将他们的成绩按 降序打印。



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



1


行给出考生人数


N ( 0 < N < 1000 )


、考题数


M ( 0


< M < = 10)


、分数线(正整数)


G


;第


2


行排序给出第


1


至第


M


题的正整数分值;以下< /p>


N


行,每行给出一名考生的准考


证号(长 度不超过


20


的字符串)、该生解决的题目总数


m


、以


及这


m


道题的题号(题目号由


1



M


)。



当读入的考生人数为

< p>
0


时,输入结束,该场考试不予处理。



输出格式:对每场考试,首先在第


1


行输出不低 于分数线的考


生人数


n


,随后


n


行按分数从高到低输出上线考生的考号与分


数 ,其间用


1


空格分隔。若有多名考生分数相同,则按他们考


号的升序输出。



输入样例:



4 5 25


10 10 12 13 15


CS004 3 5 1 3


CS003 5 2 4 1 3 5


CS002 2 1 2


CS001 3 2 3 5


1 2 40


10 30


CS001 1 2


2 3 20


10 10 10


CS000001 0


CS000002 2 1 2


0



输出样例:



3


CS003 60


CS001 37


CS004 37


0


1


CS000002 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(


读入考


生人数


N */


{


scanf(


&M,


&G); /*


读入题目数量


和分数线


*/


pMarkList = (int


*)malloc(M*sizeof(int)); /* M


道题目的分数


*/


pStuinfo = (StuInfo


*)malloc(N*sizeof(StuInfo)); /* N


个考生


*/



for(i=0;


i


++i) /*


读入


M


题每题分数


*/


scanf(



for(i=0, n=0; i


读入


N


个 考生


信息,


i


用于计数


N


次,


cnt


用于计算上线考 生记录


*/


{


scanf(


&m);/*


准考证号,解出的题目数量


m */



for(pStuinfo[n].score=0,j=0; j


++j) /*


读入答出的


m


题的题号


*/


{


scanf(


读入答对


题的题号


*/


pStuinfo[n].score +=


pMarkList[ a-1 ]; /*


因为题号是从< /p>


1


开始的;计算该


考生的总分

< p>
*/


}



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(


排序完毕,按照要求输


出,上线人数

< p>
*/


for(i=0; i


和每个上线考生的准


考证号和总分数


*/


printf(


Stuinfo[i].score);



free(pMarkList);


free(pStuinfo);


}



return 0;


}






?



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

。在今


年的数据结构考卷中,要求编写程序得到最大和,现在增加一


个要求,即还需要输出该子序列的第一个和最后一个元素。


< br>输入格式:


测试输入包含若干测试用例,


每个测试用例占


2


行,



1< /p>


行给出正整数


K( < 10000)


, 第


2


行给出


K


个整数,中


间用空格分隔。当


K



0


时,输入结束,该用例不被处理。



输出格式:对每个测试用例,在


1


行里输出 最大和、最大连续


子序列的第一个和最后一个元素,中间用空格分隔。如果最大


连续子序列不唯一,则输出序号


i


< p>
j


最小的那个(如输入样


例的第

< br>2



3


组)。若所有

< p>
K


个元素都是负数,则定义其最大


和为

< p>
0


,输出整个序列的首尾元素。



输入样例:



6


-2 11 -4 13 -5 -2


10


-10 1 2 3 4 -5 -23 3 7 -21


6


5 -8 3 2 5 0


1


10


3


-1 -5 -2


3


-1 0 -2


0



输出样例:



20 11 13


10 1 4


10 3 5


10 10 10


0 -1 -2


0 0 0



#include


#include


#include



int main()


{


long


int


K,


last; /*


输入数据 个数


K<1000


;最大子


序列最后一 个元素的下标


last */


long int ThisSum, MaxSum, TmpMaxSum, index,


*pList;



while( scanf(


{


ThisSum = 0;


MaxSum = TmpMaxSum = last = LONG_MIN;


pList = (long int *)malloc( K * sizeof(long


int) );



for(index = 0; index < K; index++)


{


scanf(



ThisSum += pList[index];



if(ThisSum > MaxSum) /*


输 入含有正数时,忽略最


大子序列中首尾


0


的影响


*/


{


MaxSum = ThisSum;/*


更新


MaxSum */


if( MaxSum > TmpMaxSum ) /*


最大值更新时,更


新最大子序列最后的数字


*/


{ /*


保证最大子序列起始位置在输入串的最前面


*/


TmpMaxSum = MaxSum;


last = index;


}


}



if( ThisSum < 0 ) ThisSum = 0;


}



/*


trace


back


to


find


first


number


of


the


max


subsequence */


for(


TmpMaxSum


=


0,


index


=


last;


index


>=


0;


index-- )


{


TmpMaxSum += pList[index];


if(TmpMaxSum == MaxSum)


break;


}



if( MaxSum < 0 ) /* K


个数字都是负数,定义最大和



0


,输出首尾元素


*/


printf(


pList[K-1]);


else


printf(


%ld


%ldn


MaxSum,


pList[index],


pList[last] );



free(pList);


}



return 0;


}






?



200 5


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


(5/5 )





第 五题:畅通工程(


15


分)



题目要求:


某省调查城镇交通状况,


得到现有城 镇道路统计表,


表中列出了每条道路直接连通的城镇。省政府“畅通工程”的

< p>
目标是使全省任何两个城镇间都可以实现交通(但不一定有直


接的道路相连 ,只要互相间接通过道路可达即可)。问最少还


需要建设多少条道路?

< br>


输入格式:测试输入包含若干测试用例。每个测试用例的第

1


行给出两个正整数,分别是城镇数目


N ( < 1000 )


和道路数



M

< p>
;随后的


M


行对应


M


条道路,每行给出一对正整数,分别


是该条道路直接连通的两个城镇 的编号。为简单起见,城镇从


1



N< /p>


编号。当


N



0


时,输入结束,该用例不被处理。



输 出格式:对每个测试用例,在


1


行里输出最少还需要建设的


道路数目。



输入样例:



4 2


1 3


4 3


3 3


1 2


2 3


5 2


1 2


3 5


999 0


0



输出样例:



1


0


2


998



#include


#include


using namespace std;



int n, visited[1024];


vector >


connect(1024,vector(1024));



int dfs(int a)


{


int i;


visited[a]=1;


for(i=1;i<=n;i++)


if (connect[a][i]==1 && visited[i]==0)


dfs(i);



return(0);


}



int main(int argc, char* argv[])


{


int i,j,a,b,count = -1;


int numtown,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<


}


return 0;


}



2006


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


(1/5)



第一题:


A+B(16



)



题目要求:读入两个 小于


10000


的正整数


A

< p>


B


,计算


A+B



需要注意的是:如果


A


B


的末尾


K

(不超过


8


)位数字相同,


请直接 输出


-1




输入格式:


测试输入包含若干测试用例,


每个测试用例占一行,


格式为



B


K


,相邻两数字有一个空格间隔。当


A



B


同时



0< /p>


时输入结束,相应的结果不要输出。



输 出格式:对每个测试用例输出


1


行,即


A+B


的值或者是


-1




输入样例:



1 2 1


11 21 1


108 8 2


36 64 3


0 0 1



?



输出样例:



3


-1


-1


100



#include


#include



int main(void)


{


unsigned int a, b, k;


unsigned char ch1[50], ch2[50];



do{


scanf(


if( a==0&&b==0 || k>8 ) break;



sprintf(ch1,



a);


sprintf(ch2,



b);



strrev(ch1);strrev(ch2);



i f(strlen(ch1)

< br>


if(strlen(ch2)




if(strncmp(ch1,ch2,k)==0)


printf(


else


printf(


}while(1);



return 0;


}







?



2006


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


(2/5)








2007-03-31 21:44:14










第二题:统计同成绩学生人数(


12


分)



题目要求:读入


N


名学生的成绩,将获得某一给定分数的学生


人数输出 。



输入格式:测试输入包含若干测试用例,每个测试用例的格 式





1


行:


N



2


行:


N< /p>


名学生的成绩,相邻两数字用一个空格间隔。


< br>第


3


行:给定分数


< p>
当读到


N=0


时输入结束。


其中


N


不超过


1000



成绩分数为


(包


含)


0



100


之间的 一个整数。



输出格式:


对每个测试用 例,


将获得给定分数的学生人数输出。



输入样例:



3


80 60 90


60


2


85 66


0


5


60 75 90 55 75


75


0



输出样例:



1


0


2



#include


#include


int main(void)


{


unsigned N, score, num, i;


unsigned pList[1000];


do


{


scanf(


if(N==0) break;


for(i=0;i


scanf(


for(num=0,i=0;i


num++;


printf(


}while(1);



return 0;


}






?



2006


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


(3/5)


第三题:火星


A+B



7


分)(


ZOJ ACM 2529




题目要求:读入两个不超 过


25


位的火星正整数


A



B


,计算


A+B


。需要注意的是:在火星上,整数不是单一进制的,第


n


位的进制就是第


n


个素数。例如:地球上的

< p>
10


进制数


2


,在


火星上记为“


1,0


”,因为火星个位数是< /p>


2


进制的;地球上的


10


进制数


38


,在火星上记为“


1,1,1,0


”,因为火星个位数



2


进制的,十位数是


3


进制的,百位数 是


5


进制的,千位数



7


进制的??



输入格式:< /p>


测试输入包含若干测试用例,


每个测试用例占一行,


包含两个火星正整数


A



B


,火星整数的相邻两位数用逗号分


隔,


A



B


之间有一个空格间隔。当


A



B


< p>
0


时输入结束,


相应的结果不要输出。

< p>


输出格式:


对每个测试用例输出


1


行,


即火星表示法的


A+B



值。



输入样例:



1,0 2,1


4,2,0 1,2,0


1 10,6,4,2,1


0 0



输出样例:



1,0,1


1,1,1,0


1,0,0,0,0,0

< br>=========================


我的代码


=============================


测试用例和输出结果:



1,0 2,1


1,0,1


4,2,0 1,2,0


1,1,1,0


1 10,6,4,2,1


1,0,0,0,0,0


0,1,0,1 0,0,1,1


1,2,0


0,0,0,0,1 1,0,0


1,0,1


0,0,0,1 0,0,0,0,0,1


1,0


96,88,82,78,72,70,66,60, 58,52,46,42,40,36,30,


28,22,18,16,12,10, 6,4,2,1 96,88,82,


78,72,70,66,60,58,52, 46,42,40,36,30,28,22,18,


16,12,10,6,4,2, 1


1,96,88,82,78,72,70,66,60,58,52,46,42 ,40,36,3


0,28,22,18,16,12,10,6,4,2,0


0,0,0 0,1,0


Press any key to continue



#include


#include


#include


#define N 25


int IsPrime(int n)


{


int i;


if(n<2) return 0;


for(i=2; i


if(n%i==0) return 0;


return 1;


}



int main(void)


{


char op1[300], op2[300], *p;


int


i,


j,


index,


num,


num1,


num2,


cnt,


breakflag;


int PrimeList[N+1], op1List[N], op2List[N],


OutputList[N+1];



for(i = 0, j = 0; i < N+1; j++) /*


计算每一位


的进制


*/


if(IsPrime(j)) PrimeList[i++] = j;



do


{


if(scanf(


break;


for(i=0; i


OutputList[i]


=


op1List[i]


=


op2List[i]


=


0;


OutputList[N] = 0;



num1


=


0;


breakflag


=


1;


p


=


strtok(op1,


while(p) /*


求出第一个输入火星数的数组


*/


{


if( ( op1List[num1++] = atoi(p) ) != 0)


breakflag = 0;


p = strtok(NULL,


}


if(breakflag)


break;


/*


第一个输入为


0


,退出循环;

< br>如果放到


ZOJ2529


,删除本行

*/



num2


=


0;


breakflag


=


1;


p


=


strtok(op2,


while(p) /*


求出第二个输入火星数的数组


*/


{


if( ( op2List[num2++] = atoi(p) ) != 0)


breakflag =0;


p = strtok(NULL,


}


if(breakflag)


break;


/*


第二个输入为


0


,退出循环;

< br>如果放到


ZOJ2529


,删除本行

*/



num1--,num2--; /* preset num1 and num2 start


from zero */


-


-


-


-


-


-


-


-



本文更新与2021-02-18 21:38,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/666073.html

浙大计算机学院考研复试上机试题及参考答案(免费)的相关文章

浙大计算机学院考研复试上机试题及参考答案(免费)随机文章