稍加分析可知罗马数字实际上就是各个位所对应的罗马数字
以252为例 2 对应II 50对应L 200 对应CC,合起来就是
252 = CCLII
由于范围是3500, 就选预存各个数位上的罗马数字 然后构建罗马数字 统计各个字母出现的数量
{
ID: yaoyuan4
PROG: preface
LANG: PASCAL
}
Program preface;
const
inf = 'preface.in'; outf = 'preface.out';
num : array[1..4, 0..9] of string =
(('','I','II','III','IV','V','VI','VII','VIII','IX'),
('','X','XX','XXX','XL','L','LX','LXX','LXXX','XC'),
('','C','CC','CCC','CD','D','DC','DCC','DCCC','CM'),
('','M','MM','MMM','' ,'' ,'' ,'' ,'' ,''));
ansi : array[1..7] of char = ('I','V','X','L','C','D','M');
var
n : longint;
ans : array[1..7] of longint;
Procedure init;
begin
assign(input, inf); reset(input);
readln(n);
close(input);
end;
Procedure work;
var
i, j, k : longint;
s : string;
begin
for i := 1 to n do
begin
j := i;
k := 0;
s := '';
repeat
inc(k);
s := s + num[k, j mod 10];
j := j div 10;
until j = 0;
for j := 1 to length(s) do
for k := 1 to 7 do
if s[j] = ansi[k] then
begin
inc(ans[k]);
break;
end;
end;
end;
Procedure print;
var
i : longint;
begin
assign(output, outf); rewrite(output);
for i := 1 to 7 do
if ans[i] > 0 then
writeln(ansi[i],' ',ans[i]);
close(output);
end;
begin
init;
work;
print;
end.