preface numbering

题目描述

一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,一下是标准数字表:


I 1 L 50 M 1000

V 5 C 100

X 10 D 500


最多3个可以表示为10n的数字(I,X,C,M)可以连续放在一起,表示它们的和:


III=3 

CCC=300 

可表示为5x10n的字符(V,L,D)从不连续出现。


除了下一个规则,一般来说,字符以递减的顺序接连出现:


CCLXVIII = 100+100+50+10+5+1+1+1 = 268 

有时,一个可表示为10^n的数出现在一个比它大的数前(I在V或X前面,X在L或C前面,等等)。在这种情况下,数值等于后面的那个数减去前面的那个数:


IV = 4 

IX = 9 

XL = 40 

像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多。对于XD(490的错误表达),可以写成 CDXC; 对于IC(99的错误表达),可以写成XCIX; 对于XM(990的错误表达),可以写成CMXC。


给定N(1 <= N < 3,500), 序言的页码数,请统计在第1页到第N也中,有几个I出现,几个V出现,等等 (从小到大的顺序)。不要输出并没有出现过的字符。


比如N = 5, 那么页码数为: I, II, III, IV, V. 总共有7个I出现,2个V出现。


PROGRAM NAME: preface


INPUT FORMAT

一个整数N。


SAMPLE INPUT(preface.in) 

5


OUTPUT FORMAT

每行一个字符和一个数字k,表示这个字符出现了k次。字符必须按数字表中的递增顺序输出。


SAMPLE OUTPUT(preface.out)

I 7

V 2

输入
输出
样例输入
 
      
样例输出
 
      

数据范围限制

var
        a,b,c,i,j:longint;
        s:ansistring;
        v:array['A'..'Z'] of longint;
        i1:char;
const s1:array[1..4,1..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','','','','','',''));
      s2:array[1..4,1..9] of integer=((1,2,3,4,5,6,7,8,9),
                                (10,20,30,40,50,60,70,80,90),
                                (100,200,300,400,500,600,700,800,900),
                                (1000,2000,3000,4000,4000,4000,4000,4000,4000));
procedure shengcheng;
begin
        for i:=4 downto 1 do
                        for j:=9 downto 1 do
                        begin
                                if c>=s2[i,j] then
                                begin
                                        dec(c,s2[i,j]);
                                        s:=s+s1[i,j];
                                end;
                        end;
end;
begin
        readln(a);
        for b:=1 to a do
        begin
                c:=b;
                s:='';
                shengcheng;
                for i:=1 to length(s) do
                begin
                        v[s[i]]:=v[s[i]]+1;
                end;
        end;
        if v['I']<>0 then writeln('I',' ',v['I']);
        if v['V']<>0 then writeln('V',' ',v['V']);
        if v['X']<>0 then writeln('X',' ',v['X']);
        if v['L']<>0 then writeln('L',' ',v['L']);
        if v['C']<>0 then writeln('C',' ',v['C']);
        if v['D']<>0 then writeln('D',' ',v['D']);
        if v['M']<>0 then writeln('M',' ',v['M']);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值