You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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终止?


问题分析与解决

你的代码逻辑本身没问题,但两个关键问题导致了错误:

  1. 数据类型溢出:UVA这道题的输入数字可能远超int的范围(比如64位整数),用int存储会溢出,进而导致读取失败,循环无法正常终止。
  2. 头文件缺失:部分严格遵循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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:12:47