USACOTrainning.Preface Numbering

一道囧的模拟题,可以这样做,赞。

大意是求出从1~n的罗马数字的各个字母的统计。

I, II, III, IV, V, VI, VII, VIII, IX         1~9
X, XX, XXX, XL, L, LX, LXX, LXXX, XC    10~90
C, CC, CCC, CD, D, DC, DCC, DCCC, CM     100~900
M, MM, MMM                                             1000~3000

然后用这些数字组合。

通过这题算是认识罗马数字了。

 

 
  
1 /*
2 ID: litstrong
3 PROG: preface
4 LANG: C++
5   */
6
7 #include < iostream >
8 #include < string >
9 #include < algorithm >
10 #include < string .h >
11 #include < vector >
12 #include < math.h >
13 #include < map >
14 #include < time.h >
15 #include < queue >
16 #include < set >
17   using namespace std;
18
19 /*
20 I 1 L 50 M 1000
21 V 5 C 100
22 X 10 D 500
23 I, II, III, IV, V, VI, VII, VIII, IX 1~9
24 X, XX, XXX, XL, L, LX, LXX, LXXX, XC 10~90
25 C, CC, CCC, CD, D, DC, DCC, DCCC, CM 100~900
26 M, MM, MMM 1000~3000
27 */
28 char a[ 10 ][ 10 ] = { " I " , " II " , " III " , " IV " , " V " , " VI " , " VII " , " VIII " , " IX " };
29 char b[ 10 ][ 10 ] = { " X " , " XX " , " XXX " , " XL " , " L " , " LX " , " LXX " , " LXXX " , " XC " };
30 char c[ 10 ][ 10 ] = { " C " , " CC " , " CCC " , " CD " , " D " , " DC " , " DCC " , " DCCC " , " CM " };
31 char d[ 10 ][ 10 ] = { " M " , " MM " , " MMM " };
32 char mo[ 10 ] = " IVXLCDM " ;
33
34 int n;
35 map < char , int > ci;
36
37 void compute( char * ch)
38 {
39 int len = strlen(ch);
40 for ( int i = 0 ; i < len; i ++ )
41 {
42 ci[ch[i]] ++ ;
43 }
44 }
45
46 void cnt( int val)
47 {
48 int t = 0 ;
49 while (val)
50 {
51 int tt = val % 10 ;
52 val /= 10 ;
53 t ++ ;
54 if (tt == 0 ) continue ;
55 if (t == 1 ) compute(a[tt - 1 ]);
56 else if (t == 2 ) compute(b[tt - 1 ]);
57 else if (t == 3 ) compute(c[tt - 1 ]);
58 else if (t == 4 ) compute(d[tt - 1 ]);
59 }
60 }
61
62 void go()
63 {
64 for ( int i = 1 ; i <= n; i ++ )
65 cnt(i);
66 int len = strlen(mo);
67 for ( int i = 0 ; i < len; i ++ )
68 if (ci[mo[i]] > 0 )
69 printf( " %c %d\n " , mo[i], ci[mo[i]]);
70 }
71
72 void ready()
73 {
74 for ( int i = 0 ; i < strlen(mo); i ++ )
75 {
76 ci[mo[i]] = 0 ;
77 }
78 }
79
80 int main()
81 {
82 freopen( " preface.in " , " r " , stdin);
83 freopen( " preface.out " , " w " , stdout);
84
85 scanf( " %d " , & n);
86 ready();
87 go();
88 }

 

转载于:https://www.cnblogs.com/litstrong/archive/2010/04/28/1723281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值