注意:此复试题目是根据CSDN博客逃离地球的小小呆上发布的回忆版整理复原。为了恢复试题的原貌,我根据试题要求进行合理的脑补,按照oj系统的风格补全了试题的Problem Description、Input、Output、Sample Input、Sample Out等内容,并加入了详解、具体的代码实现。因为是复原版,不能保证当时的题目就是这么呈现的,也不能说明考场上的试题就是oj风格叙述的,仅供大家参考。有什么错误、不合理的地方欢迎指出。
原创不易,还请大家多支持
第一题
Problem Description
给定三条边,请你判断一下能不能组成一个三角形。
Input
输入数据第一行包含一个数M,接下有M行,每行一个实例,包含三个正数A,B,C。其中A,B,C <1000
Output
对于每个测试实例,如果三条边长A,B,C能组成三角形的话,输出YES,否则NO。
Sample Input
2
1 2 3
2 2 2
Sample Output
NO
YES
这道题虽然很简单,但是有坑。首先题目说三个正数A,B,C并没三个正整数A,B,C;所以我们在保存这三条边时注意用实数型变量。其次需要注意的是每次输入只有一个M,而并非每组输入都有一个M,所以如果我们在循环过程中使用while (scanf("%d",&M)!=EOF)
就会出现Time Limit Exceeded。最后注意题目中的样例输出的是大写YES与NO。注意到这些,我们使用三角形两边之和一定大于第三边这条定理就可以来判断了,由于需要对三个边使用sort
进行升序排序,故我们用一个double
数组来存放三条边的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdio.h> #include <algorithm> using namespace std; int main() { int M; double a[3]; scanf("%d", &M); while (M > 0) { M--; scanf("%lf%lf%lf", &a[0], &a[1], &a[2]); sort(a, a + 3); puts(a[0] + a[1] > a[2] ? "YES" : "NO"); } 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
140
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; }
|