D.実験7_21_コーディング、デコード配列


整数配列aにn個の互いに異なる整数が格納され、a中の要素の値範囲は0〜n−1である.a配列の符号化定義は、a[0]の符号化が0であり、b[0]を入れる.aiの符号化は、a[0]、a[1]、...、a[i-1]においてa[i]の値より小さい数の個数とし、b[i]を入れる.例えば、a[6]={4,3,0,5,1,2}の場合、b[6]={0,0,0,3,1,2}となる.あなたは2つのタスクを持っていて、タスクは1つは符号化で、つまりnと配列aを知っていて、配列bを求めます;タスク2は復号であり、すなわちnと配列bが既知であり、配列aを求める.入力と出力の要件:まず2つの整数nとflagを入力します.nは配列要素の個数(1<=n<=100)を表し、flagはタスクタイプ(flag=1は符号化タスク、flag=2は復号タスク)を表す.次にn個の整数であり、flag=1の場合、このn個の数は配列aの内容を表す.flag=2の場合、このn個の数は配列bの内容を表す.n個の整数を出力し、flag=1の場合は符号化後配列bの内容、flag=2の場合は復号後配列aの内容とする.各整数はスペースで区切られ、最後の整数の後に改行されます.プログラム実行効果:Sample 1:5↙ 1↙ 2 1 3 0 4↙ 0 0 2 0 4 Sample 2: 8↙ 2↙ 0 1 2 0 1 1 4 5↙ 3 6 7 0 2 1 4 5
#include
int minCount(int a[], int len);
int main()
{
	int n, flag, a[100], i, j, b[100] = { 0 };
	scanf("%d", &n);
	scanf("%d", &flag);
	if (flag == 1)
	{
		for (i = 0; i < n; i++)
			scanf("%d", &a[i]);
		for (i = 1; i < n; i++)
		{
			b[i] = minCount(a, i);
		}
		for (i = 0; i < n; i++)
			printf("%d ", b[i]);
		printf("
"); } else if (flag == 2) { for (i = 0; i < n; i++) scanf("%d", &b[i]); a[n - 1] = b[n - 1]; int num[100] = { 0 },k,count; for (k = 0; k < n-1; k++) num[k + 1] = num[k] + 1; for (k = 0; k < n; k++) { if (num[k] == b[n - 1]) { for (count = k; count < n; count++) num[count] = num[count + 1]; } } for (j = n - 2; j >= 0; j--) { int count1 = 0; count1 = b[j]; a[j] = num[count1]; for (k = 0; k < n; k++) { if (k == b[j]) { for (count = k; count < n; count++) num[count] = num[count + 1]; } } } for (i = 0; i < n; i++) printf("%d ", a[i]); printf("
"); } return 0; } int minCount(int a[], int len) { int count = 0, i; for (i = 0; i < len; i++) { if (a[i] < a[len]) count += 1; } return count; }