关键词不能为空

当前您在: 主页 > 英语 >

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

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

-

2021年2月18日发(作者:syllable)


浙江大学计算机复试上机


2005-2007



(由林子整理






200 5


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


(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(1 23+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




{




< /p>


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


形式






sscanf(result,


/*



sscanf


来获



a,b


的值


*/




if( a==0 && b==0 ) break;



/* A,B


同时为零则退出


程序


*/




else printf(



/*


打印输出


A + B



数值


*/



}while(1);




return 0;


}







2005


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


(2/5)



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


10


分)



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


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


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



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


N ( > 0 )



下面列出了


N

天的记录。



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


M ( > 0 )


,下面是


M


行,每行的格式为




证件号码



签到时间



签离时间



其中时间按“小时


:


分钟


:


秒钟”(各占


2


位)给出,证件号码


是长度不超过< /p>


15


的字符串。



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


1


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


证件号码,中间用


1


空格分隔。



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


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



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



输入样例:



3


1


ME25321 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



输出样例:



ME25321 ME25321


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< /p>


,每天记录的条目数


M */



Record


*pTimeList;/*


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


进入


时间、离开时间< /p>


*/



int first, last;


/*


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


*/




scanf(


/*


读入记录的总天数


*/



while(N--)



{




scanf(



/*


读入该天的进出人员数


*/




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





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




{





scanf(


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(


pTimeList[last].id);




free(pTimeList);



} /* for N */


}







2005


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


(3/5)



第三题:分数统计(


12


分)



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


Ranklist


,但上面的< /p>


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


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


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



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



1


行给出考生人数


N ( 0 < N < 1000 )


、考题数


M ( 0 < M <


= 10)


、分数线(正整数)


G


;第


2


行排序给出第


1


题至第


M



的正整数分值;以下


N


行,每行给出一名考生的准考证号(长


度不超过


20


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


m


、以及这


m



题的题号(题目号由


1


到< /p>


M


)。



当读入 的考生人数为


0


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

< p>


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


1

< p>
行输出不低于分数线的考


生人数


n


,随后


n


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


数,其间用


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;



/* < /p>



1


题至第


M< /p>


题的正整数分值



*/





StuInfo *pStuinfo;


/*


考生信息


*/





int i,j,k,a,b,c,m;



/*


临时变量


*/





StuInfo tmp;



/*


用于排序


*/






while( scanf(


/*


读入考生人



N */





{









scanf(




/*


读入题目


数量和分数线


*/









pMarkList = (int


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



/* M


道题目的分数


*/









pStuinfo = (StuInfo


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


/* N


个考生


*/










for(i=0; i


/*

< p>
读入


M


题每题分数



*/













scanf(










for(i=0,


n=0;


i


++i)


/*


读入


N


个考生


信息,


i


用于计数


N


次,


cnt


用于计算上线 考生记录


*/









{













scanf(


&


(pStuinfo[n].id),


&m);/*


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


m */














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


j


/*


读入答出的


m


题的题号


*/













{

















scanf(


/*



读入答对题的题号


*/

















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


nfo[c].id, pStuinfo[b].id) > 0)

























c = b;



















tmp = pStuinfo[a];


















pStuinfo[a] =


pStuinfo[c];


















pStuinfo[c] = tmp;













}









}










printf(


/*


排序完毕,


按照 要求


输出,上线人数


*/









for(i=0; i


/*


和每个上线考生的


准考证号和总分数


*/













printf(


,pStuinfo[i].score);










free(pMarkList);









free(pStuinfo);





}






return 0;


}







2005


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


(4/5)





第四题:最大连续子序列(


13


分)< /p>



题目要求:给定


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)


,第

< p>
2


行给出


K


个整数,中间


用空格分隔。当


K


< br>0


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


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


1


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


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


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


i



j


最小的那个(如输入样


例的第


2



3


组)。若所有


K


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



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


的影响< /p>


*/





{






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(




else





printf(


pList[last] );





free(pList);



}




return 0;


}







2005


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


(5/5)





第五题:畅通工程(


15


分)



题目要求:


某省调查城镇交通状况,


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


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


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

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


需要建设多少 条道路?



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


1


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

< br>N ( < 1000 )


和道路数目


M



随后的


M


行对应

< p>
M


条道路,


每行给出一对正整数,


分别是该


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


1



N


编号。当

< p>
N



0


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



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


1


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


道路数目。

< p>


输入样例:



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



B



计算


A+B




要注意的是:如果


A



B


的末尾


K


(不超过


8


)位数字相同,请


直接输出


-1




输入格式:


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


每个测试用例占一行,


格式为



B


K


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


A



B


同时为


0


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



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


1


行,即< /p>


A+B


的值或者是


-1

< br>。



输入样例:



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,




strrev(ch1);strrev(ch2);




if(strlen(ch1)


0



if(strlen (ch2)


0




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





printf(



else





printf(



}while(1);




return 0;


}








2006


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


(2/5)







2007-03-31 21:44:14










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


12


分)


< /p>


题目要求:读入


N


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


人数输出。



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





1


行:


N



2


行:


N< /p>


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


< br>第


3


行:给定分数


< p>
当读到


N=0


时输入结束。其中

< br>N


不超过


1000


,成绩分数为 (包


含)


0



100


之间的一个整数。



输出格式:


对每个测试用例,


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

< p>


输入样例:



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




printf(



}while(1);




return 0;


}







2006


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


(3/5)



第三题:火星


A+B



7


分)(


ZOJ ACM 2529




题目要求:


读入两个不超过


25


位的火星正整数


A



B


计算


A+B



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


n


位的进


制就是第


n


个素数。例如:地球上的


10


进制数


2


,在火星上记

< p>
为“


1,0


”,因为火星个位数是


2


进制的;地球上的


10


进制 数


38


,在火星上记为“


1,1,1, 0


”,因为火星个位数是


2


进制的,< /p>


十位数是


3


进制的,

百位数是


5


进制的,


千位数是


7


进制的……



输 入格式:


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


每个测试用例占一行,< /p>


包含两个火星正整数


A



B


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


隔,


A



B


之间有一个空格间隔 。当


A



B



0


时输入结束,


相应的结果不要输出。



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


1< /p>


行,即火星表示法的


A+B


< p>
值。



输入样例:



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,30,28,22,1


8,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


,退出循环;


如果放到


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


,退出循环;


如果放到


ZOJ2529


,删除本行


*/





num1--,num2--;


/* preset num1 and num2 start from


zero */





if(num1 < num2) /*

< br>把输入的两个火星数数按位序对齐,


两个


if

< p>
操作只执行一个


*/





for(i = num1; i >= 0; --i)





{






op1List[i + num2 - num1] = op1List[i];






op1List[i] = 0;





}





if(num1 > num2)





for(i = num2; i >= 0; --i)





{






op2List[ i + num1 - num2] = op2List[i];






op2List[i] = 0;





}





cnt = (num1 > num2) ? num1 : num2; /* cnt


为两个火


星数的较大位数,便于 确定输出位数


*/





for( index=0, i=cnt; i>=0 i--, index++ )




{





num


=


op1List[i]


+


op2List[i]


+


OutputList[index];

-


-


-


-


-


-


-


-



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

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