在线编译器 C

#include <stdio.h> enum { SIZE = 1000 }; int compression(int a[], int b[], int N){ if(N==0){ return 0; } int count=1,save=0; if(a[0]==1){ b[save++]=0; } for(int i=1;i<N;i++){ if(a[i]==a[i-1]){ count++; }else{ b[save]=count; save++; count=1; } }b[++save]=count; return save; } int main(void) { int a[SIZE] = {0}, b[SIZE] = {0}; for (size_t i = 0; i < SIZE; i++) { scanf("%d", &a[i]); } int sizeb = compression(a, b, SIZE); printf("["); for (size_t i = 0; i < (size_t)sizeb; i++) { if (i > 0) printf(","); printf("%d", b[i]); } printf("]"); return 0; }
这段代码试图实现游程编码(Run-Length Encoding),将数组a中连续相同数字的个数存入数组b。但代码中存在逻辑错误,导致输出结果不正确。

主要问题在于处理数组a中第一个元素为1时的特殊情况,以及最后存储计数值的方式。

- 当数组a的第一个元素为1时,代码在b[0]写入0,这不符合游程编码的常规逻辑。游程编码应该记录每个连续段的长度,而不是根据元素值插入额外值。
- 最后一行 `b[++save]=count;` 使用了前置自增,导致save先自增再赋值,这样会跳过一个数组位置,并且返回的save值比实际存储的元素个数多1。应该使用后置自增 `b[save++]=count;` 来保持一致性。