求解序列最小奇数与最大偶数:代码未过在线判题,及输入输出疑问
问题解答:输入
5 2 4 2 5 4的正确输出是5 4 这个输入里存在奇数5,所以最小奇数就是5;最大偶数是4,所以最终输出是5 4。
接下来分析你的代码问题,以及对应的修正方案:
你的代码存在的几个关键问题:
- 初始化逻辑错误:
- 你把
max初始化为0,但如果所有偶数都是负数(比如输入3 -2 -4 -6),max永远不会被更新,最后会错误输出-1,而正确的最大偶数应该是-2。 min初始用了INT16_MAX,但没有包含对应的头文件(<climits>或<cstdint>),可能导致未定义行为;同时判断min是否未找到的逻辑完全多余:if (min == INT16_MAX && min != 1),只要min还是初始值,就说明没有找到奇数,直接设为-1即可。
- 你把
- freopen的误用:在线判题系统(OJ)不需要手动指定输入输出文件,直接用
cin和cout即可,freopen会干扰OJ的输入输出流,导致无法正确读取测试用例。 - 变量命名风险:
min和max是C++标准库中的函数(来自<algorithm>),虽然你没包含这个头文件,但用它们做变量名是不好的习惯,容易引发潜在冲突。
修正后的代码:
#include <iostream> #include <climits> // 必须包含此头文件才能使用INT_MIN和INT_MAX using namespace std; int main() { int n, a; int min_odd = INT_MAX; // 换变量名避免和标准库函数冲突 int max_even = INT_MIN; cin >> n; for (int i = 0; i < n; i++) { cin >> a; if (a % 2 == 0) { if (a > max_even) { // 找到更大的偶数就更新 max_even = a; } } else { if (a < min_odd) { // 找到更小的奇数就更新 min_odd = a; } } } // 处理不存在对应数字的情况 if (min_odd == INT_MAX) { min_odd = -1; } if (max_even == INT_MIN) { max_even = -1; } cout << min_odd << " " << max_even << endl; return 0; }
修正说明:
- 把
min和max换成min_odd和max_even,彻底避免命名冲突。 - 初始化
min_odd为INT_MAX(表示初始无奇数),max_even为INT_MIN(表示初始无偶数),覆盖了所有整数范围的边界情况。 - 移除了
freopen,适配OJ的默认输入输出方式。 - 拆分了偶数和奇数的判断逻辑,代码更清晰易读。
- 补充了
<climits>头文件,确保INT_MAX和INT_MIN能正确编译使用。
这样修改后,你的代码就能正确处理所有测试用例,包括全奇数、全偶数、包含负数的极端场景了。
内容的提问来源于stack exchange,提问作者v_head
相关产品推荐
相关产品推荐

