杭电2011年计算机复试真题

注意:此复试题目是根据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;//累计从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

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/2019/02/25/HDU2011.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 TeilyMa's Blog