T1:快速反应
题目概览
题目重现
小T作为班长要参加学校的快速反应比赛。比赛规则如下:
- 给定两个数字n和m
- 如果两数之和是奇数,输出"odd"
- 如果两数之和是偶数,则计算它们的乘积:
- 如果乘积是奇数,输出"odd2"
- 如果乘积是偶数,输出"even"
解题思路
这个问题看起来复杂,但其实可以通过简单的数学判断来解决。我们可以分步骤分析:
第一步:判断两数之和的奇偶性
两个数相加的结果奇偶性可以通过以下规则判断:
- 奇数 + 偶数 = 奇数
- 奇数 + 奇数 = 偶数
- 偶数 + 偶数 = 偶数
因此,我们只需要检查n和m中奇数的个数:
- 如果奇数个数为1(一个奇数一个偶数),和为奇数
- 如果奇数个数为0或2,和为偶数
第二步:当和为偶数时判断乘积的奇偶性
乘积的奇偶性规则:
- 奇数 × 奇数 = 奇数
- 奇数 × 偶数 = 偶数
- 偶数 × 偶数 = 偶数
因此,只有当n和m都是奇数时,乘积才是奇数,其他情况都是偶数。
代码实现
#include <iostream> // 包含输入输出流库
using namespace std; // 使用标准命名空间
int n, m; // 定义两个整型变量n和m
int main() {
// 读取输入的两个数字
cin >> n >> m;
// 判断两数之和是否为奇数
// 如果是奇数,直接输出"odd"
if ((n + m) % 2 == 1) {
cout << "odd" << endl;
}
// 如果和为偶数,则进一步判断乘积
else {
// 判断乘积是否为奇数
// 只有当n和m都是奇数时,乘积才是奇数
if ((n * m) % 2 == 1) {
cout << "odd2" << endl;
}
// 其他情况乘积都是偶数
else {
cout << "even" << endl;
}
}
return 0; // 程序正常结束
}

测试样例分析
以题目给出的测试样例为例:
输入:
3
2
- 3是奇数,2是偶数
- 和为3+2=5,是奇数
- 因此输出"odd"
另一个测试样例:
输入:
3
5
- 3和5都是奇数
- 和为8,是偶数
- 乘积为15,是奇数
- 因此输出"odd2"
再一个测试样例:
输入:
2
4
- 2和4都是偶数
- 和为6,是偶数
- 乘积为8,是偶数
- 因此输出"even"
数学原理总结
这个问题本质上考察的是奇偶数的运算性质:
-
加法奇偶性:
- 奇 ± 偶 = 奇
- 奇 ± 奇 = 偶
- 偶 ± 偶 = 偶
-
乘法奇偶性:
- 奇 × 奇 = 奇
- 奇 × 偶 = 偶
- 偶 × 偶 = 偶
通过掌握这些基本数学性质,我们可以快速判断出各种情况下的结果,而不需要实际计算大数的和或积。
优化思路
虽然当前解法已经足够高效,但我们可以进一步优化判断条件:
-
和为奇数的条件可以简化为:
(n % 2) != (m % 2)- 即一个数是奇数,另一个是偶数
-
乘积为奇数的条件可以简化为:
(n % 2 == 1) && (m % 2 == 1)- 即两个数都是奇数
优化后的代码:
```css
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
if ((n % 2) != (m % 2)) {
cout << "odd" << endl;
} else {
if ((n % 2 == 1) && (m % 2 == 1)) {
cout << "odd2" << endl;
} else {
cout << "even" << endl;
}
}
return 0;
}
这种写法可能更直观地反映数学原理,但性能上与原解法相当。

## 边界情况测试
为了确保程序的正确性,我们需要测试一些边界情况:
1. 最小值测试:
- 输入:1, 1
- 和为2(偶数)
- 乘积为1(奇数)
- 输出:"odd2"
2. 最大值测试:
- 输入:100, 100
- 和为200(偶数)
- 乘积为10000(偶数)
- 输出:"even"
3. 混合测试:
- 输入:99, 100
- 和为199(奇数)
- 输出:"odd"
4. 零值测试(虽然题目范围是1-100,但可以扩展思考):
- 输入:0, 1
- 和为1(奇数)
- 输出:"odd"
## 总结
这个问题通过简单的奇偶性判断就能解决,关键在于:
1. 理解题目要求的判断顺序(先判断和,再判断乘积)
2. 掌握奇偶数的基本运算性质
3. 使用模运算(%)来快速判断奇偶性


39

被折叠的 条评论
为什么被折叠?



