杭电2011年计算机复试真题

注意:此复试题目是根据CSDN博客逃离地球的小小呆上发布的回忆版整理复原。为了恢复试题的原貌,我根据试题要求进行合理的脑补,按照oj系统的风格补全了试题的Problem Description、Input、Output、Sample Input、Sample Out等内容,并加入了详解、具体的代码实现。因为是复原版,不能保证当时的题目就是这么呈现的,也不能说明考场上的试题就是oj风格叙述的,仅供大家参考。有什么错误、不合理的地方欢迎指出。
原创不易,还请大家多支持

第一题

注意:

该题出自HDUOJ 2039,以下对题目的描述都来自于2039题

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;//累计从2003-01-01到输入日期的天数
int cnty = 2003;//初始年份
int cntm = 1;//初始的月份
int disy = year - cnty;//输入的年份与2003年的差值
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 ? "晒网" : "打鱼");//第4、5天晒网
}
}

第三题

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)//若能被5整除
num /= 5;
while (num % 3 == 0)//若能被3整除
num /= 3;
while (num % 2 == 0)//若能被2整除
num /= 2;
if (num == 1)
return true;
return false;
}
int main() {
int num;
while (scanf("%d", &num) != EOF) {
puts(isugly(num) ? "是丑数" : "不是丑数");
}
return 0;
}
文章作者: Teily
文章链接: https://teily.cn/article/HDU2011.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TeilyMa's Blog