summaryrefslogtreecommitdiff
path: root/2.2/preface.c
blob: 4da1bef62edd79427df2944da361a21517f9fda1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
ID: mytbk921
LANG: C
TASK: preface
*/

#include <stdio.h>
#include <string.h>

struct Num
{
	char str[20];
};

struct Num numbers[10000];

void init_numbers()
{
#define SETSTR(n, c) numbers[n].str[0]=c;numbers[n].str[1]=0;
	int base, i, j, r;

	for (i=0; i<10000; i++)
		numbers[i].str[0] = 0;

	SETSTR(1, 'I');
	SETSTR(5, 'V');
	SETSTR(10, 'X');
	SETSTR(50, 'L');
	SETSTR(100, 'C');
	SETSTR(500, 'D');
	SETSTR(1000, 'M');

	for (base=1; base<1000; base*=10) {
		for (i=2; i<4; i++) {
			strcpy(numbers[base*i].str, numbers[base*(i-1)].str);
			strcat(numbers[base*i].str, numbers[base].str);
		}
		strcpy(numbers[base*4].str, numbers[base].str);
		strcat(numbers[base*4].str, numbers[base*5].str);
		for (i=6; i<9; i++) {
			strcpy(numbers[base*i].str, numbers[base*(i-1)].str);
			strcat(numbers[base*i].str, numbers[base].str);
		}
		strcpy(numbers[base*9].str, numbers[base].str);
		strcat(numbers[base*9].str, numbers[base*10].str);
	}
	strcpy(numbers[2000].str, "MM");
	strcpy(numbers[3000].str, "MMM");

	for (i=11; i<=3500; i++) {
		if (numbers[i].str[0])
			continue;
		r = i;
		for (base=1000; base>0; base/=10) {
			if (r >= base) {
				j = r/base;
				strcat(numbers[i].str, numbers[j*base].str);
				r = r%base;
			}
		}
	}
}


int main()
{
	int n, i, j;
	FILE *fin, *fout;
	int nchars[26];
	char *romans = "IVXLCDM";

	init_numbers();
	
	fin = fopen("preface.in", "r");
	fout = fopen("preface.out", "w");

	fscanf(fin, "%d", &n);
	fclose(fin);

	memset(nchars, 0, sizeof(nchars));
	for (i=1; i<=n; i++) {
		for (j=0; numbers[i].str[j]; j++)
			nchars[numbers[i].str[j]-'A']++;
	}
	for (i=0; romans[i]; i++) {
		if (nchars[romans[i]-'A'])
			fprintf(fout, "%c %d\n", romans[i], nchars[romans[i]-'A']);
	}
	fclose(fout);
	return 0;
}