目录
一、编译错误(Compile Error, CE):最基础也最容易忽视
二、答案错误(Wrong Answer, WA):逻辑漏洞的典型信号
三、部分用例通过(Partially Accepted)—— 考虑不周全的“半成品”
四、运行时错误(Runtime Error)—— 程序“跑着跑着就崩了”
4. 1 .1 段错误(Segmentation Fault)
4. 1 .2 除零错误(Division by zero):a / b 中 b == 0编辑编辑
五、超时(Time Limit Exceeded, TLE)—— 算法效率太低
常见复杂度与数据规模对应关系(C++ 1秒 ≈ 1e8 操作)
作者:正在备战蓝桥杯的东岸
适合人群:刚接触算法竞赛或在线编程(OJ)的新手(大一/大二计算机相关专业)
内容特点: 易错点剖析 + 代码对比 + 实战建议个人精选专栏:《蓝桥杯备战参考指南》数据结构杂谈《C语言入门指南》
引言:为什么我的代码“本地能跑,OJ却报错”?
你是否也曾信心满满地提交了一段自认为“天衣无缝”的C++代码,结果OJ无情地甩给你一行刺眼的红字:“Compile Error”、“Wrong Answer”或者“Time Limit Exceeded”?

别慌!这几乎是每一位算法初学者都会经历的“成长阵痛”。
本文将结合洛谷与牛客两大主流OJ平台,系统梳理刷题中最常见的五类错误类型,并通过真实案例+错误分析+正确写法对比,帮你快速识别问题根源、避开高频“雷区”。
📌 核心目标:不仅告诉你“错在哪”,更教你“怎么想”、“如何防”。
一、编译错误(Compile Error, CE):最基础也最容易忽视
1.1 问题表现
洛谷

刷新⼀下就能看到编译错误的信息:

牛客:

1.2 核心原因
代码存在语法错误,编译器无法生成可执行文件。
常见误区(尤其是C++新手):
- 忘记包含头文件:如用了
cout却没写#include <iostream> - 命名空间未声明:C++ 中未使用
using namespace std;,又直接写cin、cout - 语法错误:比如少写分号、括号不匹配(尤其在快写快粘时)
- 使用了本地编译器不报错但 OJ 严格限制的写法(如某些平台禁用
#include <bits/stdc++.h>)
💡 易错点提示:很多同学在本地用 VS Code 或 Dev-C++ 调试时开启“宽松模式”,但 OJ 编译器(通常是 GCC)更严格。务必在提交前检查标准语法!
💡 实用建议
- 先在本地IDE(如Code::Blocks、VS Code)编译通过再提交;
- 洛谷平台提交后若显示“编译错误”,务必点击“刷新”按钮,才能看到详细的错误信息(行号+原因);
- 养成良好编码习惯:缩进对齐、及时保存、变量命名规范,这样可以方便检查代码。
二、答案错误(Wrong Answer, WA):逻辑漏洞的典型信号
2.1 问题表现
洛谷:

牛客:

🔍 本质原因
程序能运行,但输出结果与标准答案不一致,所有测试点均失败。
这通常说明你的算法在根本思路上存在缺陷。
三、部分用例通过(Partially Accepted)—— 考虑不周全的“半成品”
3.1 问题表现
洛谷:

牛客:

3.2 本质原因
代码在部分测试数据下正确,但在边界/特殊输入下失败
3.3 解题思维升级
- 主动构造边界测试用例:如
n=0,1,2、最大值、最小值、负数(若允许)、重复元素等; - 分情况讨论:是否存在“空输入”?“全相同”?“递增/递减”?
- 检查循环范围:是否遗漏了首尾元素?
3.4 经典案例:素数对

第一次输入:
#include <iostream>
#include <cmath>
using namespace std;
bool isprime(int n) {
for (int j = 2; j <= sqrt(n); j++) {
if (n % j == 0) return false;
}
return true;
}
int main() {
int n; cin >> n;
for (int i = 3; i <= n; i++) {
if (isprime(i) && isprime(i + 2)) {
cout << i << " " << i + 2 << endl;
}
}
return 0;
}

问题分析
- 边界错误:当
i = n时,i + 2 = n + 2 > n,但题目要求两个素数都 ≤ n; - 未处理无解情况:若没有素数对,应输出
"empty"(注意是字符串,不是空行); - 素数判断缺陷:
isprime(1)返回true(1不是素数!),isprime(2)未被正确处理(因循环从2开始,sqrt(2)≈1.4,循环不执行,返回true——这点碰巧对,但逻辑不严谨)。
改进:
#include <iostream>
#include <cmath>
using namespace std;
bool isprime(int n) {
if (n < 2) return false; // 关键:1不是素数!
for (int j = 2; j <= sqrt(n); j++) {
if (n % j == 0) return false;
}
return true;
}
int main() {
int n; cin >> n;
bool found = false;
// 注意:i + 2 <= n,确保两个数都不超过n
for (int i = 3; i + 2 <= n; i++) {
if (isprime(i) && isprime(i + 2)) {
cout << i << " " << i + 2 << endl;
found = true;
}
}
if (!found) {
cout << "empty" << endl;
}
return 0;
}

📌 易错点提示:
- 素数定义:大于1的自然数,且除了1和它本身外不能被其他自然数整除;
- 边界条件(如
n=1,2,3)务必手动验证; - 输出格式(空格、换行、大小写)必须严格匹配题目要求。
四、运行时错误(Runtime Error)—— 程序“跑着跑着就崩了”
4.1 常见类型
4. 1 .1 段错误(Segmentation Fault)
例如·:访问非法内存,如数组越界、空指针解引用;

4. 1 .2 除零错误(Division by zero):a / b 中 b == 0
4 .1 .3 栈溢出:递归太深未设终止条件


4. 2 示例:数组越界
int arr[100];
for (int i = 0; i <= 100; i++) { // i=100 时越界!
cin >> arr[i];
}
4. 3 防范策略
- 数组大小开比题目上限多10~20(如题目说 n≤1000,就开
int a[1010]); - 使用
vector并配合.size()检查; - 除法前判断除数是否为0;
- 递归函数必须有明确的终止条件。
五、超时(Time Limit Exceeded, TLE)—— 算法效率太低
5.1 问题表现
洛谷:

牛客:

5.2 根本原因
- 算法时间复杂度过高(如用 O(n²) 解本可用 O(n log n) 的问题);
- 存在死循环(如
while (x > 0) { x += 1; })。
常见复杂度与数据规模对应关系(C++ 1秒 ≈ 1e8 操作)

优化方向
- 减少重复计算:用记忆化、前缀和等;
- 换更优算法:冒泡 → 快排;暴力枚举 → 二分/双指针;
总结:构建你的“OJ Debug 思维树”
当遇到错误时,按以下流程快速定位:

💬 经验之谈:我在初学时曾因 isprime(1) 返回 true 而WA了3次,也因 i <= n 而不是 i + 2 <= n 被卡住。每一个WA背后,都藏着一个你忽略的细节。

思考题
- 为什么在判素数函数中,循环条件写成
j * j <= n比j <= sqrt(n)更安全?(提示:浮点精度) - 如果题目要求“按字典序输出所有素数对”,当前代码是否满足?若不满足,如何调整?
答案放在评论区了

欢迎在评论区分享你踩过的OJ大坑!点赞+关注,不错过下期硬核内容! 💪

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=34m59s418000k



3万+

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



