罗马数字

描述 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
有时,一个可表示为10n的数出现在一个比它大1级或2级的数前(I在V或X前面,X在L或C前面,等等)。在这种情况下,数值等于后面的那个数减去前面的那个数: 

IV = 4
IX = 9
XL = 40
This compound mark forms a unit and may not be combined to make another compound mark (e.g., IXL is wrong for 39; XXXIX is correct). 

像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多。对于XD(490的错误表达),可以写成 CDXC; 对于IC(99的错误表达),可以写成XCIX; 对于XM(990的错误表达),可以写成CMXC。 90 is expressed XC and not LXL, since L followed by X connotes that successive marks are X or smaller (probably, anyway). 


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

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

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

样例输入 SampleInput [复制数据]
5
样例输出 SampleOutput [复制数据]
I 7
V 2
这道题 。。。感觉我自己就是个蠢货= =。。。。这个代码是讨论区扒来的。。。。

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

int total[256];

void  inc(char xx,int n)
{
	total[int (xx)] += n;    
}

void  add(int xx)
{
        if (xx == 1) inc('i',1); 
        if (xx == 2) inc('i',2); 
        if (xx == 3) inc('i',3); 
        if (xx == 4) {inc('i',1);inc('v',1);} 
        if (xx == 5) inc('v',1); 
        if (xx == 6) {inc('v',1);inc('i',1); }
        if (xx == 7) {inc('v',1);inc('i',2);} 
        if (xx == 8) {inc('v',1);inc('i',3);} 
        if (xx == 9) {inc('i',1);inc('x',1);} 
        if (xx == 10) inc('x',1); 
        if (xx == 20) inc('x',2); 
        if (xx == 30) inc('x',3); 
        if (xx == 40) {inc('x',1);inc('l',1);} 
        if (xx == 50) inc('l',1); 
        if (xx == 60) {inc('l',1);inc('x',1);} 
        if (xx == 70) {inc('l',1);inc('x',2); }
        if (xx == 80) {inc('l',1);inc('x',3); }
        if (xx == 90) {inc('c',1);inc('x',1); }
        if (xx == 100) inc('c',1); 
        if (xx == 200) inc('c',2); 
        if (xx == 300) inc('c',3); 
        if (xx == 400) {inc('c',1);inc('d',1); }
        if (xx == 500) inc('d',1); 
        if (xx == 600) {inc('d',1);inc('c',1);} 
        if (xx == 700) {inc('d',1);inc('c',2); }
        if (xx == 800) {inc('d',1);inc('c',3); } 
        if (xx == 900) {inc('c',1);inc('m',1); } 
        if (xx == 1000) inc('m',1); 
        if (xx == 2000) inc('m',2); 
        if (xx == 3000) inc('m',3); 
}

int main()
{
    int n, t, j, i;
    scanf("%d", &n);
    memset(total, 0, sizeof(total));
    for(j = 1; j <= n; j ++)
    {
            i = j;
            if(i >= 3000) {add(3000);i-=3000;}
            if(i >= 2000) {add(2000);i-=2000;}
            if(i >= 1000) {add(1000);i-=1000;}
            if(i >= 900) {add(900);i-=900;}
            if(i >= 800) {add(800);i-=800;}
            if(i >= 700) {add(700);i-=700;}
            if(i >= 600) {add(600);i-=600;}
            if(i >= 500) {add(500);i-=500;}
            if(i >= 400) {add(400);i-=400;}
            if(i >= 300) {add(300);i-=300;}
            if(i >= 200) {add(200);i-=200;}
            if(i >= 100) {add(100);i-=100;}
            if(i >= 90) {add(90);i-=90;}
            if(i >= 80) {add(80);i-=80;}
            if(i >= 70) {add(70);i-=70;}
            if(i >= 60) {add(60);i-=60;}
            if(i >= 50) {add(50);i-=50;}
            if(i >= 40) {add(40);i-=40;}
            if(i >= 30) {add(30);i-=30;}
            if(i >= 20) {add(20);i-=20;}
            if(i >= 10) {add(10);i-=10;}
            if(i >= 9) {add(9);i-=9;}
            if(i >= 8) {add(8);i-=8;}
            if(i >= 7) {add(7);i-=7;}
            if(i >= 6) {add(6);i-=6;}
            if(i >= 5) {add(5);i-=5;}
            if(i >= 4) {add(4);i-=4;}
            if(i >= 3) {add(3);i-=3;}
            if(i >= 2) {add(2);i-=2;}
            if(i >= 1) {add(1);i-=1;}
    }
    
    total[int ('i')]==0? :printf("I %d\n", total[int ('i')]);
    total[int ('v')]==0? :printf("V %d\n", total[int ('v')]);
    total[int ('x')]==0? :printf("X %d\n", total[int ('x')]);
    total[int ('l')]==0? :printf("L %d\n", total[int ('l')]);
    total[int ('c')]==0? :printf("C %d\n", total[int ('c')]);
    total[int ('d')]==0? :printf("D %d\n", total[int ('d')]);
    total[int ('m')]==0? :printf("M %d\n", total[int ('m')]);
    return 0;
}    








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值