李银河 壮壮:编码问题?

来源:百度文库 编辑:中科新闻网 时间:2024/05/08 06:56:30
设有一个数组A:array [0..N-1] of integer; 存放的元素为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)
要求编程解决以下问题:
(1)给出数组A后,求出其编码;
(2)给出数组A的编码后,求出A中的原数据。
有急用,谢谢大家了,帮帮忙了!!!!

#include<stdio.h>
void main()
{
int A[11],B[11],i,j,tem,n,C[11];
printf("input A[]array:\nnumber=:");
B[0]=0;
scanf("%d",&n);
printf("Aarray is yuansu:\n");
for(i=0;i<n;i++)scanf("%d",&A[i]);
for(i=0;i<n;i++)
{
tem=0;
for(j=0;j<i;j++)
{
if(A[i]>A[j])tem++;
B[i]=tem;
}
}
printf("bianma B[]array:\n");
for(i=0;i<n;i++)printf("%d ",B[i]);

printf("input B[]array:\n");
printf("number:");
scanf("%d",&n);
printf("B[]array:\n");
for(i=0;i<n;i++)scanf("%d",&B[i]);
for(i=0;i<n;i++)C[i]=i;
for(i=n-1;i>=0;i--)
{
tem=-1;
for(j=0;(j<n)&&(B[i]>tem);j++)
{
if(C[j]!=-1)tem++;
}
A[i]=C[j-1];
C[j-1]=-1;

}
printf("A: ");
for(i=0;i<n;i++)printf("%d ",A[i]);
}

运行通过....
希望得到你的肯定....

只给算法思路
1、最简单的算法:用循环比较A[I]与A[0]~A[I-1]的大小,在其满足条件的时候记数+1,这个很简单不多说了

2、给编码求数据:由于编码相当于是按最小顺序排序,那么从右到左的编码数字表示A数组中前i个数它排在第(n+1)。如B中的2表示A中对应位置的数在0-5中排在第2+1(即第3,因为起始为0),那么0-5中排第3的就是2(0、1、2);
再看B中的1,其对应位置A中的排列应为2,但是必须去掉刚才那个2(即对0、1、3、4、5排列),则排第2位的是数字1;
B中的3是对(0、3、4、5)排列,那么排在3+1位的数字是5;
那么B中第3个0表示对(0、3、4)中排序在0+1位的数字即第一位为0
以下同理。有问题加qq99581554,注明“知道”

这么简单了
自己想一下吗