c++试题(22)

有些非负整数文件中存在许多连续相等的整数段。设计程序将这种整数原文件
按以下规则压缩到另一个压缩文件中:
        .一个连续相等的整数段,如有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

void   main()
{
int   n,c=1,d=1,i;
int   t=0;
      int   a[max],b[max];
cout<<"请输入n的值:"<<endl;
cin>>n;
cout<<"请输入数据组a的值:"<<endl;
for   (i=0;i<n;i++)
cin>>a[i];
for(i=0;i<2*n;i++)
b[i]=0;
for(i=0;i<n;i++)
{
if(a[i]==a[i+1]&&t==0)
{
if(d>=1)
{
d--;
for(int   j=0;j<n;j++)
{
if(b[j]==0)
{
b[j]=-d;
for(int   k=0;k<=d;k++)
b[j+k+1]=a[i+k-d];
                break;
}
else
continue;
d=0;
}
}
c++;
}
        else
t=1;
          d++;
  if(t==1&&c>1)
  {
  for(int   j=0;j<n;j++)
  if(b[j]==0)
  {
  b[j]=c;
  b[j+1]=a[i];  
  break;
  }
  t=0;
  c=1;
  }
  if(i==n-1)
  {       if(d==n)
        {
      b[0]=-d;
      for(i=0;i<n+1;i++)
  b[i+1]=a[i];
        }
                                  else
  {
  for(int   j=0;j<n;j++)
  {
        if(b[j]==0)
{
        b[j]=-d;
        for(int   k=0;k<=d;k++)
b[j+k+1]=a[i+k-d];
                break;
}
  }
  }
  }
}
for(i=0;i<2*n;i++)
{
if(b[i]!=0)
cout<<b[i]<<endl;
        else
break;
}
}

#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、付费专栏及课程。

余额充值