在前面给大家提供的C语言网Online Judge系统支持语言和编译说明
中,对于判题结果仅仅是大致的解释,仍不少同学感到迷惑,那今天我们就对这些结果一一详细解释并举例说明,让大家彻底觉悟!
等待 | |
等待 | 服务器正忙,请稍后查看 |
运行并评判 | 您的程序正在评测中 |
编译中 | 您的程序正在被编译 |
正确 | 恭喜您!完全正确! |
格式错误 | 结果正确,但格式不正确,比如多或少了换行或空格 |
答案错误 | 经过比对,您的程序错误 |
运行错误 | 程序运行后发生错误,可能包括:
1. 指针/数组违规访问 2. 除数为0 3. 函数调用错误,或栈溢出 4. 捕捉到违背处理的STL或自定义异常等
|
时间超限 | 程序运行时间超过了时间限制,请检查程序的算法效率 |
内存超限 | 程序使用的内存超过了内存限制,请检查程序是否栈/堆开辟空间过大 或内存泄露 |
输出超限 | 输出了与答案无关的信息,比如“please input”等提示 |
编译错误 | 程序语法错误,编译不通过。可能您在本地可以编译通过,但可能使用了非标准C的函数 ,请使用符合标准的语法。 |
对于,前三种,等待、运行并评判、编译中这第三种基本没什么问题,由题目的测试数据大小、服务器的资源情况决定的,基本怎么也在半分钟以内完成的(一直如此,可能服务器出问题,请联系管理员了)。第四种正确那想必是大家都想看到的!是我们通过一道题的终极目标!
重点呢,大家要明白OJ的原理,它的判题原则呢就是看你的程序输出和答案的输出进行比对,看看是否一模一样!请时刻牢记,要一模一样!一模一样!一模一样!(重要事情说三遍!)
下面我们给大家详细介绍几种常见的,告诉大家到底什么原因。
第一个是“格式错误”
格式错误,简单的解释就是结果正确,但由于格式不对,多或者少了换行、空格等等。这种情况大多发生在输出结果时,结果本身是正确的,但由于格式控制与标准答案不一致导致。如果题目有多组数据,比如咱们训练场的ACM入门训练1085题,求A+B的和,有多组测试数据,人家输入1空格5那你要输出6,人家输入10空格20你要输出30,如果就这么两组测试数据的话,那么你的答案应该是:
6
20
看到这个样子你应该想想你的格式控制了吧,那么这里输出是要有换行的,如果这里没有打换行,而是打了一个空格。那么你的输出结果将是:
6_20_
你和标准答案对对看,人家是竖着的,你是横着的,能对么?(记住,要一模一样!)
机智的是OJ知道你数对了,但格式不对,所以结果就是格式错误!
另一种情况,如果这里只输出,空格和回车都没有,那么你的结果将是:
620
啥?620?! 当然不是六百二,可你的程序输入结果明明如此嘛!
所以这种情况,直接报答案错误!
怎么样,关于这个格式错误,大家明白了吗?
第二个,“答案错误”
这种情况, 可能为做题人没有明白题目的意思,训练场题库中的题目基本都给出了样例输入和样例输出,是让你写完程序后测试、验证用的,不代表后台的测试数据就这些(PS:后台刁难你的数据多的很呢,hiahiahia~)。这里我们遇到的大多数情况,是你的程序可能已经测试过能通过样例的数据,但这不代表可以通过后台的测试数据。
以训练场1392题为例,计算A+B的和,但,请仔细看题,题目中有描述称“多行测试数据,每行包含两个正整数a和b,a和b的范围不会超过1000位”,看到了吗?a和b不会超过1000位啊!验题君偷偷告诉你,它说不超过1000位,八成后台就有999位的数据在等你!你难道还敢写printf(“%d\n”,a+b);的代码吗?别说int了,就是long long也放不下哦! 想都不用想,肯定报答案错误!
这题是典型的大数相加算法。所以,一定要保证程序考虑的通用和全面性,包括是否有特殊情况没有考虑到。
第三个,“运行错误”
运行错误,基本上是你的程序运行过程中出错崩溃、停止了。可能有同学又会问,我自己机器上测试没问题啊!还是那句话,后台数据多的很,不定哪组数据就会让你的程序出问题,出现属于组越界访问、指针异常的问题,或某种情况下,除数出现为0的情况,甚至C++的STL库运用不当等等,这个时候,验题君建议同学们自己给自己多举几个常规和特殊的例子,然后断点调试全过程,逐句观察吧。验题君也只能帮到这了。
第四个,“时间超限”
这种情况,八成是因为你的程序算法效率过低,不能在固定的时间要求内完成(一般是1s)。咱们C语言网的题普遍以入门和日常训练为主,此类算法题相对很少。这个问题也引申一些竞赛技巧,难以一一讲清,只能建议大家多训练、参加比赛来提升!
第五个,“内存超限”
这个问题基本少之又少了,相比之下java类代码内存较大,但很少有此类现象发生,也不排除C/C++代码有内存泄漏,譬如忘记free/delete内存等等。
第六种,“输出超限”
这类问题新人较常见,可能受于教学环境影响,习惯性在scanf和printf之前打印:“请输入”、“a,b的结果是:”、“please input”类似的语句,这种写法将直接存入输出结果中,作为结果比对,报输出超限甚至答案错误的结果。因为OJ是逐字符比对!还是那四个字:一模一样!
第七种,“编译错误”
首先,避免这个问题,建议大家使用Dev-c++、CodeBlocks、gcc编译器。以VC6为例,可能不写#include<stdio.h>用printf也可以,但OJ提交就会报错,还有64位长整形表示不同等等。建议训练场刷题同学使用刚才建议的三种编译器之一(下载链接见附)。
总结错误原因,请确认提交代码在gcc编译器环境下编译无误再进行提交,如果有把握使用VC6,则请确认代码在两种环境下没有编译兼容问题。
附:C/C++开发和学习人员必备工具下载集合(含助手及破解补丁)
以上七种,希望可以解决同学们的一些疑惑!
C语言网训练场,提供支持C/C++/JAVA语言的在线评测训练系统,欢迎大家提交反馈!私信验题君哦!