-
浙江大学计算机复试上机
2005-2007
(由林子整理
)
200
5
年浙江大学计算机学院考研复试上机试题及参考答案
(1/5
)
第一题:
A+B(10
分
)
[
结题
]
题
目要求:读入两个小于
100
的正整数
A
和
B
,计算
A+B
。
需要注意的是:
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);
/*
p>
获取输入字符串,不能使用
scanf
,因
为
有空格
*/
天的记录。
个整数的序列
<
br>0 <
br>输出格式:对每个测试用例,在 <
br>N ( < 1000 )
<
br>。 <
br>第 <
br>N
计算
百位数是
<
br>=========================
<
br>把输入的两个火星数数按位序对齐,
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 )
p>
,下面是
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 */
}
p>
2005
年浙江大学计算机学院考研复试上机试题及参考答案
(3/5)
第三题:分数统计(
12
分)
题目要求
:今天的上机考试虽然有实时的
Ranklist
,但上面的<
/p>
排名只是根据完成的题数排序,没有考虑每题的分值,所以并
不是
最后的排名。给定录取分数线,请你写程序找出最后通过
分数线的考生,并将他们的成绩
按降序打印。
输入格式:测试输入包含若干场考试的信息。每
场考试信息的
第
1
行给出考生人数
p>
N ( 0 < N < 1000
)
、考题数
M ( 0 < M <
= 10)
、分数线(正整数)
G
p>
;第
2
行排序给出第
1
题至第
M
题
的正整数分值;以下
N
行,每行给出一名考生的准考证号(长
度不超过
20
的字符串)、该生解决的
题目总数
m
、以及这
m
道
题的题号(题目号由
1
到<
/p>
M
)。
当读入
的考生人数为
0
时,输入结束,该场考试不予处理。
输出格式:对每场考试,首先在第
1
行输出不低于分数线的考
生人数
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
/*
读入
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;
}
p>
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)
,第
2
行给出
K
个整数,中间
用空格分隔。当
K
为
时,输入结束,该用例不被处理。
1
行里输出最大和、最大
连续
子序列的第一个和最后一个元素,中间用空格分隔。如果最大
连续子序列不唯一,则输出序号
i
和
j
最小的那个(如输入样
例的第
2
p>
、
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
p>
;最大子序
列最后一个元素的下标
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;
}
p>
2005
年浙江大学计算机学院考研复试上机试题及参考答案
(5/5)
第五题:畅通工程(
15
分)
题目要求:
某省调查城镇交通状况,
得到现有城镇道路统计表,
表中列出了每条道路直接连通的城镇。省政府
“畅通工程”的
目标是使全省任何两个城镇间都可以实现交通(但不一定有直
接的道路相连,只要互相间接通过道路可达即可)。问最少还
需要建设多少
条道路?
输入格式:测试输入包含若干测试用例。每个测试用
例的第
1
行给出两个正整数,分别是城镇数目
和道路数目
M
;
随后的
M
行对应
M
条道路,
每行给出一对正整数,
分别是该
条道路直接连通的两个城镇的编号。为简单起见,城镇从
1
到
N
编号。当
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
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
。
p>
输入格式:
测试输入包含若干测试用例,
每个测试用例占一行,
格式为
B
K
,相邻两数字有一个空格间隔。当
A
和
B
同时为
0
时输入结束,相应的结果不要输出。
p>
输出格式:对每个测试用例输出
1
行,即<
/p>
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,
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>
名学生的成绩,相邻两数字用一个空格间隔。
3
行:给定分数
当读到
N=0
时输入结束。其中
不超过
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
printf(
}while(1);
return 0;
}
p>
2006
年浙江大学计算机学院考研复试上机试题及参考答案
(3/5)
第三题:火星
A+B
(
7
分)(
ZOJ ACM
2529
)
题目要求:
读入两个不超过
25
位的火星正整数
A
和
B
,
A+B
。
需要注意的是:在火
星上,整数不是单一进制的,第
n
位的进
制就是第
n
个素数。例如:地球上的
10
进制数
2
,在火星上记
为“
1,0
”,因为火星个位数是
2
进制的;地球上的
10
进制
数
38
,在火星上记为“
1,1,1,
0
”,因为火星个位数是
2
进制的,<
/p>
十位数是
3
进制的,
5
进制的,
千位数是
p>
7
进制的……
输
入格式:
测试输入包含若干测试用例,
每个测试用例占一行,<
/p>
包含两个火星正整数
A
和
B
,火星整数的相邻两位数用逗号分
隔,
A
和
B
之间有一个空格间隔
。当
A
或
B
为
0
时输入结束,
相应的结果不要输出。
输出格式:对每个测试用例输出
1<
/p>
行,即火星表示法的
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
我的代码
=============================
测试用例和输出结果:
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) /*
两个
if
操作只执行一个
*/
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];
-
-
-
-
-
-
-
-
-
上一篇:浙大计算机学院考研复试上机试题及参考答案(免费)
下一篇:世界是不断发展变化的