描述
设有一个数组 A:;数组中存放的元素为0~N-1之间的整数,且A[i]≠A[j](当i≠j时)。
例如:
N=5时,有:A=(4,3,0,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,1,2)
程序要求解决以下问题:
① 给出数组A后,求出其编码;
② 给出数组A的编码后,求出A中的原数据。
输入:
每个测试文件只包含一组测试数据,每组输入包含三行。
第一行输入整数N;
第二行输入有两种可能:
例如:
A=(4,3,0,5,1,2)
或
B=(0,0,0,3,1,2)
其中输入中的逗号和括号都是英文状态下的。
输出:
当输入的是A=(…),则输出其编码。
当输入的是B=(…),则输出A中的原数据。
输出数据的格式和输入数据的格式是一样的。
样例输入:
6
A=(4,3,0,5,1,2)
样例输出:
B=(0,0,0,3,1,2)
实现代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXSIZE 100
void displayB(int array[], int size);
void displayA(int array[], int size);
int main()
{
int size; /*要输入多少个数据*/
int A[MAXSIZE]; /*原数据*/
int B[MAXSIZE]; /*编码后的数据*/
int indexOfA = 0;
int indexOfB = 0;
char c;
char flag;
while(scanf("%d", &size) != EOF){
indexOfA = 0;
indexOfB = 0;
flag = 0;
memset(A, 0, MAXSIZE * sizeof(int));
memset(B, 0, MAXSIZE * sizeof(int));
/**********/
/*数据读取*/
/**********/
fflush(stdin);
while((c = getchar()) != ')'){ /*遇到)表示一组数据输入完成*/
if(c == 'A')
flag = 'A';
else if(c == 'B')
flag = 'B';
if(isdigit(c)){ /*判断字符是否是数字*/
ungetc(c, stdin); /*把c返回输入流*/
if(flag == 'A')
scanf("%d", &A[indexOfA++]); /*获取数据,存入数组A*/
else if(flag == 'B')
scanf("%d", &B[indexOfB++]);
}
}
if(flag == 'A'){ /*输出编码*/
B[0] = 0;
for(indexOfA = 1; indexOfA < size; indexOfA++){
for(indexOfB = 0; indexOfB < indexOfA; indexOfB++){
if(A[indexOfB] < A[indexOfA]){
B[indexOfA]++;
}
}
}
displayB(B, size);
}else{ /*输出原数据*/
for(indexOfB = 1; indexOfB < size; indexOfB++){
A[indexOfB] = B[indexOfB];
for(indexOfA = 0; indexOfA < indexOfB; indexOfA++){
if(A[indexOfB] <= A[indexOfA])
A[indexOfA]++;
}
}
displayA(A, size);
}
}
return 0;
}
void displayB(int array[], int size)
{
printf("B=(");
for(int i = 0; i < size; i++){
if(i == size - 1)
printf("%d)", array[i]);
else
printf("%d,", array[i]);
}
}
void displayA(int array[], int size)
{
printf("A=(");
for(int i = 0; i < size; i++){
if(i == size - 1)
printf("%d)", array[i]);
else
printf("%d,", array[i]);
}
}