设有一个整形数组 A[0..N-1];存放的元素为 0~N-1 (1<N<=10)之间的整数,且 A[i]≠A[j](i≠j)。例如,当N=6时,有:A=(4,3,0,5,1,2)。此时,数组A的编码定义如下:
A[0]编码为0;
A[i]编码为:在A[0],A[1],...,A[i-1]中比A[i]的值小的个数 (i=1,2,...,N-1)
例如上面数组 A的编码为:B=(0,0,0,3,1,2)
若给出数组A,则可求出其编码。同理,若给出数组A的编码,可求出A中的原数据。
输入:
推导方向(取值为1或2,如为1,则表示根据数组求数组编码;如为2,则表示根据编码反求数组)
数组个数
数组或数组编码元素
输出:
数组编码、或数组本身(元素之间以空格分隔)
#include<stdio.h>
main()
{int a,b,i,y[10],d[10]={0},j,k,m,n=0;
scanf("%d%d",&a,&b);
for(i=0;i<b;i++)
scanf("%d",&y[i]);
if(a==1)
{for(j=0;j<b;j++)
for(k=0;k<j;k++)
if(y[k]<y[j]) d[j]++;
}
else {for(j=b-1;j>0;j--)
{for(k=b-1;k>=0;k--)
{n=0;
for(m=0;m<k;m++)
{if(y[m]>=0)n++;}
if(y[k]==n){d[k]=j;y[k]=-1;break;}
if(k==0) {d[k]=j;y[k]=-1;}
}
}
}
for(j=0;j<b-1;j++)
printf("%d ",d[j]);
printf("%d\n",d[b-1]);
}