注意:此复试题目是根据CSDN博客逃离地球的小小呆 上发布的回忆版整理复原。为了恢复试题的原貌,我根据试题要求进行合理的脑补,按照oj系统的风格补全了试题的Problem Description、Input、Output、Sample Input、Sample Out等内容,并加入了详解、具体的代码实现。因为是复原版,不能保证当时的题目就是这么呈现的,也不能说明考场上的试题就是oj风格叙述的,仅供大家参考。有什么错误、不合理的地方欢迎指出。
原创不易,还请大家多支持
第一题
Problem Description
输入一个十进制的数,把它转成十六进制
Input
一个十进制整数,所给整数在int所能表达的范围之内。测试实例有多组,每组占一行
Output
输出转为16进制数的结果,每组输出占一行
Sample Input
1024 255
Sample Output
400 FF
进制转换问题实质上是一种特殊的位数拆解问题。为什么说进制转换也是数位拆解的一种呢?那是因为,进制转换与数位拆解一样,最终目的也是要求各个数位上的数字。不同的是,数位拆解要求的是十进制表示的数字各个数位上的数字,而进制转换求的则是以某种进制表示的数字用另一种进制来表示时各个数位上的数字。我们以十进制转换为二进制为例,我们有十进制数x,转换其为二进制即求
b 0 , b 1 , b 2 , ⋯ , b n b_0,b_1,b_2,\cdots,b_n
b 0 , b 1 , b 2 , ⋯ , b n
又因为
x = b 0 × 2 0 + b 1 × 2 1 + b 2 × 2 2 + b 3 × 2 3 + ⋯ + b n × 2 n x=b_0\times2^0+b_1\times2^1+b_2\times2^2+b_3\times2^3+\cdots+b_n\times2^n
x = b 0 × 2 0 + b 1 × 2 1 + b 2 × 2 2 + b 3 × 2 3 + ⋯ + b n × 2 n
我们应从位数拆解的方法中得到启示,首先对x模2,即:
x % 2 = ( b 0 × 2 0 + b 1 × 2 1 + b 2 × 2 2 + b 3 × 2 3 + ⋯ + b n × 2 n ) % 2 x\%2=(b_0\times2^0+b_1\times2^1+b_2\times2^2+b_3\times2^3+\cdots+b_n\times2^n)\%2
x % 2 = ( b 0 × 2 0 + b 1 × 2 1 + b 2 × 2 2 + b 3 × 2 3 + ⋯ + b n × 2 n ) % 2
x % 2 = b 0 × 2 0 % 2 + b 1 × 2 1 % 2 + b 2 × 2 2 % 2 + b 3 × 2 3 % 2 + ⋯ + b n × 2 n % 2 x\%2=b_0\times2^0\%2+b_1\times2^1\%2+b_2\times2^2\%2+b_3\times2^3\%2+\cdots+b_n\times2^n\%2
x % 2 = b 0 × 2 0 % 2 + b 1 × 2 1 % 2 + b 2 × 2 2 % 2 + b 3 × 2 3 % 2 + ⋯ + b n × 2 n % 2
x % 2 = b 0 x\%2=b_0
x % 2 = b 0
这样我们就得到了该数字由二进制表示时最低位数字。接下来,我们只需要对x做整数除法,对其除2,即可讲高位数字向低位移动,即
x / 2 = b 0 × 2 0 / 2 + b 1 × 2 1 / 2 + b 2 × 2 2 / 2 + b 3 × 2 3 / 2 + ⋯ + b n × 2 n / 2 x/2=b_0\times2^0/2+b_1\times2^1/2+b_2\times2^2/2+b_3\times2^3/2+\cdots+b_n\times2^n/2
x / 2 = b 0 × 2 0 / 2 + b 1 × 2 1 / 2 + b 2 × 2 2 / 2 + b 3 × 2 3 / 2 + ⋯ + b n × 2 n / 2
x / 2 = b 1 × 2 0 / 2 + b 2 × 2 1 / 2 + ⋯ + b n × 2 n − 1 / 2 x/2=b_1\times2^0/2+b_2\times2^1/2+\cdots+b_n\times2^{n-1}/2
x / 2 = b 1 × 2 0 / 2 + b 2 × 2 1 / 2 + ⋯ + b n × 2 n − 1 / 2
在通过求模运算依次求得被移动到低位的数字,如此往复,直到得到所有位数上的数字,即可完成进制转换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { int a; while (scanf ("%d" , &a) != EOF) { char ans[40 ], size = 0 ; do { int x = a % 16 ; ans[size++]= (x < 10 ) ? x + '0' : x - 10 + 'A' ; a /= 16 ; } while (a); for (int i = size-1 ; i >= 0 ; i--) printf ("%c" , ans[i]); printf ("\n" ); } return 0 ; }
第二题
Problem Description
贪吃蛇游戏大家一定都有玩过,已知自身长度10格的贪吃蛇初始时在10*10的地图中位于黑色位置,红色方块表示蛇头,贪吃蛇可以往四个方向移动,每次移动一格。现在你来判断贪吃蛇是否可以成功的到达目的地
Input
输入只有一行,包含一个整数s一个字符d,用空格隔开。s表示前进的步数,d表示前进的方向(只允许输入字符'E'、'W'、'S'、'N')
Output
根据贪吃蛇的实际情况,判断贪吃蛇在移动后的状态,输出“成功”、“撞到自身”或“出界”。可能有多组测试数据,对于每组数据,输出一行
Sample Input
5 W 3 N 5 S
Sample Output
出界 撞到自身 成功
注意:
该题经过我的重新改编。由于回忆版对题目描述并不清晰,我尽最大的努力把这道题还原了出来,但感觉已经没有了原题目的味道,没太大做的价值了。就当看看得了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #include <stdio.h> char maze[10 ][10 ]; int snake[][2 ] = { 4 ,5 , 4 ,6 , 3 ,6 , 2 ,6 , 1 ,6 , 1 ,5 , 1 ,4 , 1 ,3 , 1 ,2 , 1 ,1 }; int go[][2 ] = { 1 ,0 ,-1 ,0 ,0 ,1 ,0 ,-1 }; void move (int d,int s) { for (int i = 0 ; i < s; i++) { for (int j = 9 ; j > 0 ; j--) { snake[j][0 ] = snake[j - 1 ][0 ]; snake[j][1 ] = snake[j - 1 ][1 ]; } snake[0 ][0 ] += go[d][0 ]; snake[0 ][1 ] += go[d][1 ]; for (int k = 1 ; k < 10 ; k++) { if (snake[k][0 ]==snake[0 ][0 ]&& snake[k][1 ] == snake[0 ][1 ]) { printf ("撞倒了自身\n" ); return ; } } if (snake[0 ][0 ]>10 ||snake[0 ][1 ]>10 || snake[0 ][0 ] < 0 || snake[0 ][1 ] <0 ) { printf ("出界\n" ); return ; } } printf ("成功\n" ); } int main () { int step; char dir; while (scanf ("%d %c" , &step,&dir) != EOF) { switch (dir) { case 'E' :move(0 , step); break ; case 'W' :move(1 , step); break ; case 'N' :move(2 , step); break ; case 'S' :move(3 , step); break ; } } return 0 ; }
这道题被我改的其实已经没有什么营养了,就是用一个二维数组保存一下贪吃蛇的身体坐标。注意移动的时候是把坐标数组从后往前赋值。还有就是坐标差数组的运用的灵感来源于BFS,大家多注意下这种方法,不仅在BFS上很有用,在DFS也有奇效。