logo资料库

北航计算机复试上机真题 2006~2016.pdf

第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
资料共30页,剩余部分请下载后查看
16 年上机题
15 年上机题
14 年上机题
13 年上机题
12 年上机题
11 年上机题
10 年上机题
09 年上机题
08 年上机题
07 年上机题
06 年上机题
北京航空航天大学计算机系考研 复试06-14 上机真题及答案 复试上机指导 1. 本真题只是提供辅助作用,关键还是研友平时动手能力练习和对 算法、数据结构的理解,参加过 ACM 的有一定优势 没参加过 的也不用紧张,北航的上机题相对于清华和北大,难度上小很 多,多练习的话,问题不大; 2. 上机时,可以快速阅读所有的题目,按照从易到难的次序做题, 保证会的一定得分; 3. 熟悉编程环境,熟悉 c 的常用函数; 4. 为了快速测试代码的正确性,尤其是矩阵输入的情况,可以利用 标准输入重定向, freopen(“c:\\input.txt”,”r”,stdin);加快测试过 程; 5. 注意程序边界条件的测试; 6. 如果你有什么疑问,或者我们提供的材料有问题,欢迎联系我们: bwiunbuaa@163.com 提供北航计算机报考和选导师指导,或者 到 kao400.com 给我们留言。
16 年上机题 1.给定一个数 n,将这个数的各位顺序颠倒,称为逆序数 m。 例如 1234 的逆序数是 4321 如果 m 是 n 的 k 倍(k 为整数),那么输出 n*k=m 例如输入 1089 输出 1089*9=9801 如果 m 不是 n 的整数倍,那么输出 n 和 n 的逆序数 例如输入 1234 输出 1234 4321 再例 输入 23200 输出 23200 00232 已知输入开头不包含多余的 0 2.给一个 c 语言的 enum 定义语句,输出 enum 中规定的各项值 例: enum BOOL{true,false}; 输出 true 0 false 1 enum date{JAN=1,FEB,MAR,APR,MAY,JUN,JULY,AUG,SEP,OCT,NOV,DEC,MON=1,TUE,WED, THU,FRI,SAT,SUN,found=1949}; 输出 JAN 1 FEB 2 MAR 3 APR 4 MAY 5 JUN 6 JULY 7 AUG 8 SEP 9 OCT 10 NOV 11 DEC 12 MON 1 TUE 2 WED 3 THU 4 FRI 5 SAT 6 SUN 7 found 1949
15 年上机题 第一题:求“相亲数”,即输入两个正整数 a 和 b,若 a 的所有约数(包括 1, 不包括 a 本身)的和等于 b,且 b 的所有约数(包括 1,不包括 b 本身)的和等 于 a,则两个数是相亲数。要求分别输出两个正整数的约数和的式子,再换行后 输出 1 或 0,表示这两个数是否为“相亲数”。 样例输入: 220 284 样例输出: 220,1+2+4+5+10+11+20+22+44+55+110=284 284,1+2+4+71+142=220 1 还有一个样例,有些复杂,记不清了 第二题:模拟鼠标点击时桌面的窗口叠放次序 先输入一个数字 n,表示桌面窗口的数量 再输入 n 行,每行 5 个数,分别为窗口 ID,窗口左下角横坐标,左下角纵坐标, 右上角横坐标,右上角纵坐标(坐标均以屏幕左下角为 0 点),先输入的窗口叠 放在后输入的窗口上面 再输入 m 行,表示 m 次点击,每行两个数,分别表示点击的横坐标和纵坐标 要求按窗口叠放次序从高到低依次输出窗口的 ID 样例输入与样例输出记不清了 第三题:统计词语 输入一段含标点的英文语段(若干行,以 Ctrl+Z 结束) 统计这段话中出现的所有词语 要求按字典顺序输出词语,每输出一个词换一行 样例输入就是一段话,输出就是这段话出现的所有词语(相同的词语只出现一次) 14 年上机题 第一题,阶乘数。输入一个正整数,输出时,先输出这个数本身,跟着一个逗号, 再输出这个数的各位数字的阶乘和,等号,阶乘和的计算结果,并判断阶乘和是 否等于原数,如果相等输出 Yes,否则输出 No。题目说明输入的正整数以及其各 位阶乘和都不会超出 int 型的表示范围。 输入样例 1: 145 输出样例 1: 145,1!+4!+5!=145 Yes
输入样例 2: 1400 输出样例 2: 1400,1!+4!+0!+0!=27 No 第二题,五子棋。输入一个 19*19 的矩阵,只包含数字 0、1、2,表示两人下五 子棋的棋牌状态,1、2 分别表示两人的棋子,0 表示空格。要求判断当前状态下 是否有人获胜(横向、竖向或者斜线方向连成 5 个同色棋子)。题目说明输入样 例保证每条线上至多只有连续 5 个同色棋子,并且保证至多只有 1 人获胜。如果 有人获胜,输出获胜者(1 或 2)加一个冒号,接着输出获胜的五连珠的第一个 棋子的坐标,从上到下从左到右序号最小的为第一个,序号从 1 开始编号。如果 无人获胜,输出 no。 样例略。 第三题,排版题。输入若干行字符,表示某电影的演职员表,每行只有一个冒号, 冒号前面是职位,冒号后面是姓名,要求把各行冒号对齐,删除多余空格后输出。 先输入一个数字,表示排版要求的冒号位置,该位置号保证比各行冒号前的最大 字符数还要大。再输入若干行字符,最多 50 行,每行最多 100 个字符,除空格、 制表符和回车之外都是有效字符,要求每行的冒号处于格式要求的位置,冒号两 边与有效单词之间各有一个空格,冒号前面的单词之间只有一个空格(删除多余 的空格和制表符),在冒号左边右对齐,前面全由空格填充,冒号后面的单词之 间也只有一个空格,在冒号右边左对齐,最后一个单词后不加空格直接换行。 13 年上机题 第一题,给一个真分数的分子分母,输出约分后的分子分母,送分题,25 分; 第二题,简单版八皇后,15 分;第三题,给出一个标准输入的正数(开头末尾 没有多余的 0),输出其科学计数法表示结果。比如:输入 0.000002,输出 2e-6; 输入 123.456,输出 1.23456e2;输入 123456,输出 1.23456e2 12 年上机题 1.【问题描述】 某些整数能分解成若干个连续整数的和的形式,例如 15 = 1 + 2+3+4+5 15 = 4 + 5 + 6
15 = 7 + 8 某些整数不能分解为连续整数的和,例如:16 输入:一个整数 N(N <= 10000) 输出:整数 N 对应的所有分解组合,按照每个分解中的最小整数从小到大输出,每个分解占一行, 每个数字之间有一个空格(每行最后保留一个空格);如果没有任何分解组合,则输出 NONE。 解题思路: 根据题目,任何可以进行分解的整数,必然满足(m+n)(n-m+1)/2 的形式,可以暴力尝试 所有 m 和 n 组合,如果满足则输出,否则输出 None。 代码: #include #include int main(){ int n; while(scanf("%d",&n) != EOF){ int begin,end; int found = 0; for(begin=1;begin
小岛面积 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 1 上面矩阵的中的 1 代表海岸线,0 代表小岛。求小岛面积(即被 1 中包围的 0 的个数)。注 意:仅求这样的 0,该 0 所在行中被两个 1 包围,该 0 所在列中被两个 1 包围。 输入: 第一行输入一个整数 N,表示输入方阵的维数 输入一个 N 维方阵 输出: 小岛面积 样例输入: 6 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 1 样例输出: 8 解题思路: 理解题目本身意思,可以发现对于矩阵中的 0 是否属于内陆,取决于该 0 所处的 行和列上,如果 0 满足,如下条件则 O 为内陆,否则不是。  0 所在的行,0 的左边和右边必须有 1  0 所在的列,0 的上面和下面必须有 1 所以,解题思路就是,遍历所有的行和列,记录改行或列,最左面和最右面(或 者最上面和最下面)1 的坐标,然后当遇到 0,判断是否处于记录的值的中间, 是,则是内陆,面积加 1,否则不加。 代码: #include #include #define DEBUG_BUAA_122 int main(){ int N; //矩阵维数 int island[100][100]; int data[100][4]; //输入岛数据的方阵
#ifdef DEBUG_BUAA_122 freopen("/Users/bwiunbuaa/tmp/oj/buaa_122.in", "r", stdin); #endif /* JOBDU_H_ */ while(scanf("%d",&N) != EOF){ int i,j; //初始化 memset(data,-1,100*4*sizeof(int)); //读入数据 for(i=0;i data[j][2] && i < data[j][3] && j > data[i][0] && j < data[i][1]){ area++; //printf("i=%d,j=%d\n",i,j); for debug } } } } printf("%d\n",area); }
return 0; } 3.【问题描述】 统计关键字出现位置 输入: 一行标准 c 语言代码(字符个数小于 300),统计出该字符串中关键字的 if,while,for 所在的位置,按照关键字出现的顺序依次输出。注意双引号内的不需要统计。 输入:一行标准 c 语言代码,字符个数小于 300 输出: 关键字 if,while,for 对应的位置,按照关键字出现的顺序依次输出。输出格式为:关键 字,后跟冒号,然后是出现的位置。扫描到关键字就输出,每个输出占一行。 样例输入: #include int main() {int i = 0; if(i == 0) printf("YES"); return 0;} #include int main() {int ifwhile = 0; int forif = 1;char if_for_while = 'a';char *str = "while"; while(ifwhile == 0) {ifwhile = 1;forif = 0;} if(forif == 0) {if_for_while = 'b';} if(ifwhile == 1) {if_for_while = 'c';} return 0;} 样例输出: if:43 while:88 if:133 if:170 解题思路: 首先把输入字符串切分为一个个的单词,然后对每个单词进行匹配。注意 c 语言中的 strtok 函 数,不能够返回位置(当分隔符连续时,比如+=,计算出前导的分割符有几个),所以不能满足 本题的要求,必须自己写获取单词的函数(反正也不复杂啦)。因为考虑到引号的问题,我们的 解决方案是首先对输入字符串进行预处理,将“”内的每个字符都替换为#,然后再进行单词分 割(切词),最后进行匹配。具体步骤:  输入源码字符串预处理,将””内的每个字符替换为#  一次获取源码中的单词,看是否为查找的关键词,如果是则输出 代码: #include #include #include #define DEBUG_BUAA_123 #define MAX_WORD_LEN 128 #define MAX_LEN 300 #define KW_NUM 3
分享到:
收藏