1. 杭电网安复试编程题解析
作为一名参加过多次编程竞赛的老手,我深知这类题目对算法思维和代码实现能力的考察重点。下面我将详细拆解这三道题目,分享我的解题思路和实战经验。
1.1 关羽过关斩三将
这道题目看似简单,但暗藏几个关键考察点:
cpp复制bool isprime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
素数判断是这道题的核心算法。这里有几个优化点值得注意:
- 只需检查到√n即可,因为如果n能被大于√n的数整除,那么它必定已经被小于√n的因数整除过
- 从2开始检查,跳过所有偶数(虽然这个实现中没有做这个优化)
- 可以预先生成素数表来优化多次查询的情况
输入处理部分采用了do-while循环确保输入合法:
cpp复制do {
cin >> x;
if (x <= 0 || x >= 50)
cout << "武力值需大于0且小于50,请重新输入关羽的武力值:";
} while (x <= 0 || x >= 50);
提示:在实际编程竞赛中,输入验证通常会占用较多代码量。建议封装成单独的函数复用。
1.2 员工考勤统计
这道题考察时间处理和结构体使用。我的实现中将时间转换为秒数处理:
cpp复制int toSeconds(const string& t) {
int h = (t[0] - '0') * 10 + (t[1] - '0');
int m = (t[3] - '0') * 10 + (t[4] - '0');
int s = (t[6] - '0') * 10 + (t[7] - '0');
return h * 3600 + m * 60 + s;
}
这种方法的优势在于:
- 将时间比较转换为整数比较,简化逻辑
- 方便计算时间差(直接相减)
- 避免了字符串处理的复杂性
注意:时间字符串格式必须严格为"HH:MM:SS",否则会出错
