Онлайн компилятор C

#include <stdio.h> enum { SIZE = 1000 }; int compression(int a[], int b[], int N){ int count=1; int num=0; for(int i=1;i<N;i++){ if(a[i]==a[i-1]){ count++; } else{ b[num]=count; num++; count=1; } } b[num]=count; num++; return num; } 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)压缩算法。它读取1000个整数到数组a中,然后统计连续相同数字的个数,将每个连续段的长度存入数组b,最后输出b数组的内容。

代码的主要逻辑在compression函数中:遍历数组a,当遇到与前一个元素相同的数字时增加计数器count,遇到不同数字时就把当前count存入b并重置count。循环结束后还需要把最后一组的count存入b。

- 注意compression函数中,当数组a的第一个元素与第二个元素不同时,循环从i=1开始,但此时还没有处理第一个元素对应的count。实际上第一个元素对应的count在循环中会被正确处理,因为当a[1]不等于a[0]时,会先存入count=1(对应a[0]的计数),然后重置count。但这里有一个边界情况:如果数组a中所有元素都相同,循环结束后只存了一次count,这是正确的。

- 代码中变量num用来记录b数组的索引,每次存入后递增,最后返回num作为压缩后的长度。这个逻辑是正确的,但需要确保b数组足够大,这里b的大小是SIZE,而压缩后的长度最多也是SIZE,所以没问题。