题面

(preface.pas/c/cpp)
一类书的序言是以罗马数字标页码的。传统罗马数字用单个字母表示特定的数值,以下是标准数字表:
I 1 V 5 X 10 L 50 C 100 D 500 M 1000
最多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

一个数 用罗马数字来表示 有且仅有一种 而且不能复合嵌套使用(比如I是1 X是10 有人可能要说 IXL就能表示50-10-1 但是IXL绝对不能用来表达39 ) (那么39用什么来表示呢 XXXIX是唯一 而且正确的选择- -)

像XD, IC, 和XM这样的表达是非法的,因为前面的数比后面的数小太多。对于XD(490的错误表达),可以写成 CDXC; 对于IC(99的错误表达),可以写成XCIX; 对于XM(990的错误表达),可以写成CMXC。 90 写成 XC 而不是 LXL, 因为 L 后面的 X 意味着后继标记是 X 或者更小 (不管怎样,可能吧)(等同于阿拉伯数字 每位 数字分别表示)。

给定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:
(preface.in)
一个整数N。
OUTPUT FORMAT:
(preface.out)
每行一个字符和一个数字k,表示这个字符出现了k次。字符必须按数字表中的递增顺序输出。
SAMPLE INPUT
5
SAMPLE OUTPUT
I 7
V 2

分析:

本题其实是找规律题题目。首先我们把每个数字分解成每一位,探究发现,每一位至多有三个数字组成(具体字母见代码),记为a,b,c,设a<b<c,则十进制中:

  • 1~3由a组成
  • 4由1a1b组成
  • 5~8本质与1~3相同,由a,b组成
  • 9由1a1c组成

这样之后把统计的个数都记录在一个数组中,最后判断是否有再输出。

要注意:当前数字等于0时要包括在1~3中,否则必须严格卡住范围,不能最后只else

代码:

#include<cstdio>
#include<map>
using namespace std;
map<char,int>m;
char a,b,c;
void search(int x)
{int ans=0; while(x){ans++;if(ans==1)a='I',b='V',c='X';//个位的组成 else if(ans==2)a='X',b='L',c='C';//十位 else if(ans==3)a='C',b='D',c='M';//百位else a='M';//千位及以上 int dq=x%10;if(dq>=0&&dq<=3)m[a]+=dq;elseif(dq==4){m[a]++;m[b]++;}elseif(dq>=5&&dq<=8){m[a]+=dq-5;m[b]++;}else{m[a]++;m[c]++;}x=x/10;}return ;
}
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){search(i); }if(m['I'])printf("I %d\n",m['I']);if(m['V'])printf("V %d\n",m['V']);if(m['X'])printf("X %d\n",m['X']);if(m['L'])printf("L %d\n",m['L']);if(m['C'])printf("C %d\n",m['C']);if(m['D'])printf("D %d\n",m['D']);if(m['M'])printf("M %d\n",m['M']);return 0;
}

Preface Numbering序言页码相关推荐

  1. usaco Preface Numbering 序言页码

    Preface Numbering 序言页码 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,一下是标准数字 表: I 1 L 50 M 1000 V 5 C 100 X 10 ...

  2. USACO:2.2.1 Preface Numbering 序言页码

    USACO:2.2.1 Preface Numbering 序言页码 一.题目描述 ★Preface Numbering 序言页码 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数 ...

  3. [USACO 2.2.1] Preface Numbering

    [题目描述] Preface Numbering 序言页码 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,一下是标准数字表: I 1 L 50 M 1000 V 5 C 10 ...

  4. preface numbering

    1262. [USACO题库]2.2.1 Preface Numbering序言页码 (Standard IO) 时间限制:  1000 ms  空间限制:  262144 KB  具体限制   题目 ...

  5. 序言页码(纯思维题)

    题目描述 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,一下是标准数字表: I 1 L 50 M 1000 V 5 C 100 X 10 D 500 最多3个可以表示为10n ...

  6. P1465 序言页码 Preface Numbering (手推)

    题目描述 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 V 5 X 10 L 50 C 100 D 500 M 1000 最多3个同样的可以表示为 ...

  7. 洛谷P1465 [USACO2.2]序言页码 Preface Numbering

    题目描述 给定 nn,求 1 \sim n1∼n 的 罗马数字 表示中,各个字符出现了多少次. 比如 n = 5n=5,表示为 I, II, III, IV, V.总共有 77 个 I 出现,22 个 ...

  8. USACO-Section2.2 Preface Numbering

    2017-8-30 题目描述 序言的页码数,请统计在第1页到第N页中,有几个I出现,几个V出现... 解答 将已知存起来,不再重复计算,没有求的用已经求好的加起来 代码 /* ID: 18795871 ...

  9. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告 ---------------------------------------------------------------------------------------- ...

最新文章

  1. Qt Designer信号和槽
  2. 按键映射_第三章 中文注释及按键相关
  3. first OData Batch operation when Sales Pipeline is launched
  4. Qt for Android 开发环境配置
  5. 构造函数的原型和原型链
  6. 在Linux上安装Zookeeper
  7. Linux文件类型详解
  8. Ceph性能调优和建议
  9. freemarker自动生成html页面,利用Freemarker生成html静态页面_html/css_WEB-ITnose
  10. 计算机科学概论第12版中文版
  11. 数据预测之BP神经网络具体应用以及matlab代码
  12. jquery版本问题
  13. springboot嘉应房地产公司质量管理系统毕业设计源码453100
  14. 如何解决没有指定在Windows运行或者它包含错误
  15. ROS单线多拨后负载均衡配置
  16. GOF23设计模式之桥接模式
  17. 【QT】实现贪吃蛇小游戏(附源码)
  18. c++语言程序设计(第四版)郑莉链表的实现源码
  19. 用Python爬取城市天气预报信息并进行图片复刻
  20. ECSHOP v2.5数据库字典

热门文章

  1. 【常识】气体单位%Vol、ppm、%LEL
  2. [C++] 配平化学方程式算法的封装
  3. 工程师也该学习机器学习了!
  4. 项目常用的合同类型,特点及报价方式
  5. pyton random
  6. C++汉字转拼音( 转)
  7. PicGo+Gitee(码云)搭建个人博客的免费图床
  8. Xcode9点击对象跳转
  9. oracle日期英文
  10. 安装Win10之后如何进入BIOS