数据压缩

有些非负整数文件中存在许多连续相等的整数段。设计程序将这种整数原文件
按以下规则压缩到另一个压缩文件中:
    .一个连续相等的整数段,如有C(C>1)个连续相等整数, 在压缩文件中存入C
      和这个整数。
    .一个不连续相等的整数段,如有C(C≥1)个整数, 其中每个整数都与其相邻
      的整数不等,在压缩文件中存入-C和这C个整数。
  例如,原文件为
      2 2 2 4 4 4 8 3 8 1 1 1 1 2 1
  则它的压缩文件为
      3 2 3 4 -3 8 3 8 4 1 -2 2 1

===================================================================================

#include<iostream>
#include<cstdlib>
using namespace std;
int* make(int *a,int &n)
{
   int i=0,j=-1,k=0;
   int *b=(int*)malloc(2*n*sizeof(int));
   while(n-i)
    {
        if(a[i]==a[i+1])
        {
                while(a[i]==a[i+1])
                {
                    i++;
                    if(i==n-1)break;
                }
                b[k++]=i-j;
        b[k++]=a[i];
                j=i;i++;
        }   
        else
        {
                while(a[i]!=a[i+1])
                {
                    i++;
                    if(i==n-1)
                    {
                        i++;
                        break;
                    }   
                }      
                b[k++]=j-i+1;
                while(++j<i)b[k++]=a[j];
                j--;
        }  
    }
    b=(int*)realloc(b,k*sizeof(int));
    n=k;
    return b;
}
int main()
{
    int a[]={1,2,1,2,2,2,4,4,4,8,3,8,1,1,1,1,1,1,2,2,2,5,6,9,9,9,2,1},len=sizeof(a)/sizeof(int);
    int *b=make(a,len);
    for(int i=0;i<len;i++)cout<<b[i]<<"  ";
    cout<<endl;
    system("PAUSE");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值