Description
一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,一下是标准数字表:
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出现。Input
一个整数N。
Output
每行一个字符和一个数字k,表示这个字符出现了k次。字符必须按数字表中的递增顺序输出。
题解
暴力出正解。Executing... Test 1: TEST OK [0.000 secs, 340 KB] Test 2: TEST OK [0.000 secs, 340 KB] Test 3: TEST OK [0.000 secs, 340 KB] Test 4: TEST OK [0.000 secs, 340 KB] Test 5: TEST OK [0.000 secs, 340 KB] Test 6: TEST OK [0.000 secs, 340 KB] Test 7: TEST OK [0.000 secs, 340 KB] Test 8: TEST OK [0.000 secs, 340 KB]All tests OK.
代码
{ID: zyx52yzlLANG: PASCALTASK: preface}var i,v,x,l,c,d,m,n,k:longint;procedure print;begin if i<>0 then writeln('I ',i); if v<>0 then writeln('V ',v); if x<>0 then writeln('X ',x); if l<>0 then writeln('L ',l); if c<>0 then writeln('C ',c); if d<>0 then writeln('D ',d); if m<>0 then writeln('M ',m);end;procedure main;var ii:longint;begin for ii:=1 to n do begin k:=ii; while k>0 do case k of 1..3:begin i:=i+1; k:=k-1; end; 4:begin k:=k-4; i:=i+1; v:=v+1; end; 5..8:begin k:=k-5; v:=v+1; end; 9:begin k:=k-9; i:=i+1; x:=x+1; end; 10..39:begin k:=k-10; x:=x+1; end; 40..49:begin k:=k-40; l:=l+1; x:=x+1; end; 50..89:begin k:=k-50; l:=l+1; end; 90..99:begin k:=k-90; x:=x+1; c:=c+1; end; 100..399:begin k:=k-100; c:=c+1; end; 400..499:begin k:=k-400; d:=d+1; c:=c+1; end; 500..899:begin k:=k-500; d:=d+1; end; 900..999:begin k:=k-900; m:=m+1; c:=c+1; end; else begin k:=k-1000; m:=m+1; end; end; end;end;begin assign(input,'preface.in'); assign(output,'preface.out'); reset(input); rewrite(output); readln(n); main; print; close(input); close(output);end.