注意:此复试题目是根据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数组来存放三条边的值
| 12
 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来进行判断,本题也较为简单
| 12
 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连续整除即可。
| 12
 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;
 }
 
 |