注意:此复试题目是根据CSDN博客逃离地球的小小呆 上发布的回忆版整理复原。为了恢复试题的原貌,我根据试题要求进行合理的脑补,按照oj系统的风格补全了试题的Problem Description、Input、Output、Sample Input、Sample Out等内容,并加入了详解、具体的代码实现。因为是复原版,不能保证当时的题目就是这么呈现的,也不能说明考场上的试题就是oj风格叙述的,仅供大家参考。有什么错误、不合理的地方欢迎指出。 原创不易,还请大家多支持
第一题 Problem Description
输入三个正整数。判断这三个数能不能构成一个三角形。
Input
三个正整数A、B、C。测试实例有多组,每组占一行
Output
如果这三个数可以构成三角形输出It is a triangle,不能构成输出It is not a triangle,每组输出占一行
Sample Input
3 4 5 1 1 3
Sample Output
It is a triangle It is not a triangle
这道题一样非常简单,只需我们知道三角形两边之和一定大于第三边这条定理就可以来判断,由于需要对三个边使用sort
进行升序排序,故我们用一个整形数组来存放三条边的值
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> #include <algorithm> using namespace std ;int main () { int a[3 ]; while (scanf ("%d%d%d" ,&a[0 ],&a[1 ],&a[2 ])!=EOF) { sort(a, a + 3 ); puts (a[0 ] + a[1 ] > a[2 ] ? "It is a triangle" : "It is not a triangle" ); } return 0 ; }
第二题 Problem Description
有个人从2003年1月1日开始,三天打鱼两天晒网,输入年份、月份、日期,问在某年某月的某一天他是在打鱼还是在晒网。假设输入的日期都在2003年1月1日以后
Input
有多组数据,每组数据占一行,表示当前日期,形式为YYYYMMDD
Output
输出当前日期是在打鱼还是晒网,每组输出占一行
Sample Input
20030105 20051123
Sample Output
晒网 打鱼
注意:
该题经过我的重新改编,在原叙述中题目中输入的日期指定在2003年,即不涉及年份的跨越。由于不跨越年份略显简单,现在杭电应该不会出真么简单的跨年份都不涉及的题目,故做出修改
这道题的实质是计算输入日期到给定日期差值的问题,涉及到日期的问题一般都要讨论是否是闰年。这里我们是定义一个宏#define ISYEAP(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0
来进行判断,本题也较为简单
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 #include <stdio.h> #define ISYEAP(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0 int dayOfMonth[13 ][2 ] = {0 ,0 ,31 ,31 ,28 ,29 ,31 ,31 ,30 ,30 ,31 ,31 ,30 ,30 ,31 ,31 ,31 ,31 ,30 ,30 ,31 ,31 ,30 ,30 ,31 ,31 }; int main () { int year, month, day; while (scanf ("%4d%2d%2d" ,&year,&month,&day)) { int sum = 0 ; int cnty = 2003 ; int cntm = 1 ; int disy = year - cnty; for (int i = disy; i >0 ; i--) { while (cntm < 13 ) sum += dayOfMonth[cntm++][ISYEAP(cnty)]; cnty++; cntm = 1 ; } for (int j = 1 ; j < month; j++) sum += dayOfMonth[j][ISYEAP(year)]; sum += day; puts (sum % 5 == 0 || sum % 5 == 4 ? "晒网" : "打鱼" ); } }
第三题 Problem Description
把只包含素因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。 给出一个正整数N,判断这个数是否为丑数。
Input
输入一个正整数,有多组数据,每组数据占一行
Output
输出当前数字是否为丑数,若是则输出“是丑数”否则输出“不是丑数”,每组输出占一行
Sample Input
24 100
Sample Output
是丑数 是丑数
本题实质上是数学问题,搞清楚丑数的定义之后解题思路就很明了了。丑数一定可以被2、3或者5整除并且除尽。因此,判别丑数的代码就是判别一个实数能否被2,3,5连续整除即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <stdio.h> bool isugly (int num) { while (num % 5 == 0 ) num /= 5 ; while (num % 3 == 0 ) num /= 3 ; while (num % 2 == 0 ) num /= 2 ; if (num == 1 ) return true ; return false ; } int main () { int num; while (scanf ("%d" , &num) != EOF) { puts (isugly(num) ? "是丑数" : "不是丑数" ); } return 0 ; }