如何在C++中不使用数组求整数最大值?附错误代码排查
问题分析与解决方案
任务要求
给定一组整数,找出其中的最大值。
- 输入说明:先输入整数N(1≤N≤105),代表待输入的整数个数;下一行输入N个空格分隔的整数(范围为−1018≤ai≤10^18)。
- 输出说明:输出这组整数的最大值。
- 示例:
输入:
输出:4 3 5 1 45
你的代码问题
你提供的代码在处理全负数输入时会出错,比如输入所有数都是负数的测试用例,代码会错误输出0。此外代码存在非标准写法问题:
#include<iostream> using namespace std; void main() { long long b,c=0; int a; cin>>a; for (int i = 0; i<a ; i++) { cin>>b; if (b>=c) c=b; else c=c; } cout<<c; }
错误原因
- 初始最大值设置错误:你把
c初始化为0,但如果所有输入的整数都是负数,实际最大值是其中最大的负数,而代码会保留0作为结果,导致错误。 - 非标准主函数写法:
void main()不是C++标准写法,标准要求主函数返回int类型,即int main(),并在末尾返回0。
修正后的代码
方法1:用第一个输入的数初始化最大值
这种方法不需要依赖头文件的极值常量,更直观:
#include<iostream> using namespace std; int main() { int a; cin >> a; long long c; // 先读第一个数作为初始最大值 cin >> c; for (int i = 1; i < a; i++) { long long b; cin >> b; if (b > c) c = b; } cout << c; return 0; }
方法2:用最小极值初始化最大值
如果担心第一个数读取的边界情况,可以用long long类型的最小值初始化:
#include<iostream> #include<climits> // 引入LLONG_MIN的头文件 using namespace std; int main() { int a; cin >> a; long long c = LLONG_MIN; // 初始化为long long的最小值 for (int i = 0; i < a; i++) { long long b; cin >> b; if (b > c) c = b; } cout << c; return 0; }
不使用数组的实现思路
你当前的代码其实已经没有使用数组——不需要存储所有输入的整数,只需要在遍历每个数时,维护一个记录当前最大值的变量(比如上面的c)。每读入一个数,就和当前最大值比较,更新最大值即可。这种方法的空间复杂度是O(1),非常高效,完全符合题目要求。
内容的提问来源于stack exchange,提问作者Ahmed Reda
相关产品推荐
相关产品推荐

