OJ、ACM提交常见错误类型

OJ、ACM提交常见错误类型

一.Presentation Error(输出格式错误)

主要换行或者空格使用错误造成的 , 出现Presentation Error说明思路没问题,很多时候就是和后台样例有那么一点点点点差别,不是最标准的输出结果,自己稍微再修改一般可以对的吧。

常见PE错误:

  • 每行输出之后有空行
  • 每两行输出之间有空行
  • 一行中,每个输出数字(或字符串,等)之间有空格
  • 一行中,每个输出数字(或字符串,等)之后有空格

二.variable-sized object may not be initialized(编译错误)

原因,定义数组的时候使用变量来定义数组长度。

如下代码:

int a = 10;

char b[a];                    //编译不报错

//char b[a] = "jfkd";    //报错,使用变量定义长度时,不可在定义时同时进行初始化赋值,需要在之后进行赋值
printf("b = %s, len = %d:%d\n", b, strlen(b), sizeof(b));

如下代码则无问题:

int a = 10;

char b[a];                    //编译不报错

strcpy(b, "jfdljf");

printf("b = %s, len = %d:%d\n", b, strlen(b), sizeof(b));

 

原因:在C中,使用变量来定义数组长度是,这个数组可以定义,却不能同时进行初始化赋值,需要在之后赋值。

三. runtime error(运行时错误)程序崩溃了

  1. 除以零
  2. 数组越界:int a[3]; a[10000000]=10;
  3. 指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10;
  4. 使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));free§; *p=10;
  5. 数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];(一般较大的数组用全局变量不要用局部变量)

具体错误信息:

  1. Runtime Error(ARRAY_BOUNDS_EXCEEDED) // array bounds exceed 数组越界
  2. Runtime Error(DIVIDE_BY_ZERO) //divisor is nil 除零
  3. Runtime Error(ACCESS_VIOLATION) //illegal memory access 非法内存读取
  4. Runtime Error(STACK_OVERFLOW) //stack overflow 系统栈过载
四.process exited without return value 322212225725
  1. 栈溢出

    • 超出了定义的数组的空间
    • 递归或循环的出口判断失误导致无限循环
  2. 操作未未初始化的指针

    • 对一个未分配内存空间的指针进行赋值或者拷贝操作
五.如果输入的数都正常,存储在数组中的数也正常但是输出时就不正常(全部为零)

原因可能是数据类型不匹配,如将unsigned long long int变量用%d输出或作为 f ( int x)的参数

六.Segmentation fault(分段错误)

七.没有与参数列表匹配的 重载函数 “sort” 实例 – 参数类型为: (book *, book *, < unknown-type >)"

struct book
{
    int v,w;
    double y;
    int index;
} a[maxx];
bool  cmp(struct book a,struct  book b)//如果这个位置不加struct就会报这个错
{
    return a.y<b.y;
}
int  f(double x)
{
    double sum=0;
    for(int i=1;i<=n;i++)
    {
        a[i].y=a[i].v-x*a[i].w;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=n;i>=n-k+1;i--)
    sum+=a[i].y;
    if(sum>=0) return 1;
    return 0;
}

八.Time Limit Exceeded(运行超出时间限制)

  1. 没有循环终止条件 (加上终止条件)

  2. 函数调用超时 (改用循环而不是用递归)

    要用到一个n的阶乘时 ,调用了一个递归函数来求阶乘,运行测试正确,却出现了超时情况。然后换了一种做法,用一个for循环去求阶乘,结果就通过了。递归调用因为经常会调用自身很多次,所以时间的复杂度是指数级别的。

  3. 程序算法不够优化 (优化算法)

  4. 程序本身存在问题

  5. 没有判断输入结束

    • while(scanf("%d",&n)!=EOF))
    • while(~scanf("%d",&n))
    • while(gets(s)!=NULL)

九.Memory Limit Exceeded(内存超限)

空间复杂度太大

十.Output Limit Exceeded(输出超限)

OLE一般是某地方输出陷入了死循环,或者输出没有明确的终止(一般是由于输入没有明确终止)。

例如:

while(~scanf("%s",str)){}//本应这么写
while(scanf("%s",str)){}//如果怎么写就会导致输出超限(while一直不会终止)

十一.Compile Error(编译错误)

  1. 变量未定义就使用,或定义后使用位置超出了定义的作用域。

    说明:如b=25但程序并未在使用前定义好b的类型,还应注意变量作用域。

  2. 括号不匹配。

    说明:()、[]、{}一定要有始就得有终。

  3. 使用非法类型。

    说明:如__int64在GCC编译器下不识别,你却用它。

  4. 需少分号。

    说明:忘了语句以一个分号结束。

  5. 用函数未引头文件。

    说明:如printf函数在G++中未包含stdio.h文件。

  6. 包含非标准头文件。

    说明:如conio.h并非标准库中定义的头文件。

  7. 使用非标准库函数。

    说明:如itoa、strupr等并不是C标准库中的函数,不能使用。

  8. 有非法字符。

  9. 提交时所用的语言不对,比如c++的程序用c交了(c写的程序用c++提交可以过)

  10. 自定义函数未声明就使用

  11. 程序连编译都不能过,有各种错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值