C++新手求助:如何让程序正确以EOF终止(适配VirtualJudge)
解决UVA《Hashmat the Brave Warrior》的EOF终止问题
作为C++初学者,我尝试解决UVA入门编程题《Hashmat the Brave Warrior》。题目要求输出输入的两个数字的差值,输入以EOF(文件结束符)终止。
示例输入
10 12 10 14 100 200
示例输出
2 4 100
我的代码如下:
#include <iostream> using namespace std; int main(){ int a, b; while (cin >> a >> b){ cout << max(a,b) - min(a,b) << endl; } }
但即使输入空内容,程序仍持续运行,提交至VirtualJudge后被判错误。请问如何修改程序使其能正确以EOF终止?
问题分析与解决
你的代码逻辑本身没问题,但两个关键问题导致了错误:
- 数据类型溢出:UVA这道题的输入数字可能远超
int的范围(比如64位整数),用int存储会溢出,进而导致读取失败,循环无法正常终止。 - 头文件缺失:部分严格遵循C++标准的编译器需要显式引入
<algorithm>头文件才能使用max和min函数,缺失可能引发编译问题。
修改后的代码:
#include <iostream> #include <cstdlib> // 用于long long类型的绝对值函数llabs using namespace std; int main(){ long long a, b; // 改用64位整数类型处理大数值 while (cin >> a >> b){ cout << llabs(a - b) << endl; // 直接计算差值的绝对值,替代max-min的写法 } return 0; }
关键说明
- 换成
long long是核心:题目中的测试数据可能包含极大整数,int的范围(通常±2e9)不够用,溢出会导致程序逻辑混乱,甚至让cin进入错误状态,循环停不下来。 - 使用
llabs而非普通abs:普通abs仅针对int类型,llabs专门处理long long的绝对值,避免类型转换错误。 - 本地测试EOF触发:Windows下按
Ctrl+Z,Linux/macOS按Ctrl+D,输入完数据后按这个组合键就能让程序终止;OJ会自动用EOF结束输入,无需手动操作。
内容的提问来源于stack exchange,提问作者Raymonk Surya
相关产品推荐
相关产品推荐

