题目链接:http://acm.swust.edu.cn/problem/0666/

Time limit(ms): 1000      Memory limit(kb): 65535
 
Description
小李去埃及旅游,但是初来乍到的他不认识罗马数,所以请你将阿拉伯数n ( 0 < n <= 1000)改写为罗马数.

 
Input
N行数据,每行一个满足0 < n <= 1000的数; 
结束以EOF判断

 
Output
每行一个,见输出示例

 
Sample Input
1
10
35
99
400
Sample Output
1=I
10=X
35=XXXV
99=XCIX
400=CD
 
基本数字: 
I:一 V:五 X:十 L:五十 C:一百 D:五百 M:一千 
记数方法 
  (1)相同的数字连写,所表示的数等于这些数字相加得到的数,如: Ⅲ = 3; 
  (2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12; 
  (3)小的数字,(限于Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ = 4;Ⅸ = 9; 
  (4)在一个数的上面画一条横线,表示这个数增值 1 000 倍,如:Ⅻ = 12 000 。 
编辑本段 
组数规则 
  (1)基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。 
  (2)不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。 
  (3)V 和 X 左边的小数字只能用Ⅰ。 
  (4)L 和 C 左边的小数字只能用×。 
  (5)D 和 M 左 边的小数字只能用 C 。

Hint
 
 
解题思路:这里讲两种方法,像这类题纯粹找规律,做这道题时,我分析了多个数的组成方式。例如1=I,2=II,3=III,4=IV,5=V,6=VI,7=VII,8=VIII,9=IX,10=X······
     其实后面的数都和1~9的形式一样,只需要分析每位的数值就行;下面是一些关键数值39=XXXIX,40=XL,49=XLIX,50=L,89=LXXXIX,90=XC······
     因此想399,499,899这几种数就是分界点;最后只需从首位递归下去就可以了~~~
 
代码如下:
 #include<iostream>
using namespace std;
char key[], X[] = " IXCMVLD";//数的五倍用i+4表示
int cnt;
void Rserve(int x){
int i, cur = , k = , lp = ;
while (x > cur){
cur = * cur + ;
k++;
}
for (i = ; i < k; i++, lp *= );
if (x <= * lp - ){
for (i = ; i < x / lp; i++)
key[cnt++] = X[k];
}
else if (x <= * lp - ){
key[cnt++] = X[k];
key[cnt++] = X[k + ];
}
else if (x <= * lp - ){
key[cnt++] = X[k + ];
for (i = ; i < x / lp - ; i++)
key[cnt++] = X[k];
}
else{
key[cnt++] = X[k];
key[cnt++] = X[k + ];
}
if (x%lp) Rserve(x%lp);
}
int main(){
int i, x;
while (cin >> x){
cnt = ;
Rserve(x);
cout << x << '=';
for (i = ; i < cnt; i++)
cout << key[i];
cout << endl;
}
return ;
}

当然了这道题这么溜,直接分析数字的组成方式1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1,与这些数字相关联会发生比如3和4,8和9,之间数字构成有一个本质的变化,具体的看题目的规则吧,然后每一个数字对应一个罗马数字组合递归找就是了具体见下表

1000 900 500 400 100 90 50 40 10 9 5 4 1
M CM D CD C XC L XL X IX V IV I

很溜的代码如下:

 #include <iostream>
#include <string>
using namespace std;
int x[] = { , , , , , , , , , , , , };
string L[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
string exchange(int n){
string s;
int i = ;
while (n){
if (n >= x[i]){
n -= x[i];
s += L[i];
}
else
i++;
}
return s;
}
int main(){
int n;
while (cin >> n){
cout << n << '=';
cout << exchange(n) << endl;
}
return ;
}

这个代码ce,不过拿来改造用来玩还是不错的,至少答案全正确

 #include <stdio.h>
void main(){
static char *a[][] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"
"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XCC", "", "C", "CC", "CCC",
"CD", "D", "DC", "DCC", "DCCC", "CM" };
int n, t, i, m;
printf("Please enter number:");
scanf("%d", &n);
printf("%d=", n);
for (m = , i = ; m < ; m++, i /= ){
t = (n%i) / (i / );
printf("%s", a[ - m][t]);
}
printf("\n");
}

[Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)的更多相关文章

  1. 小米 OJ 编程比赛 01 月常规赛_灯_找规律

     灯 序号:#125难度:有挑战时间限制:1000ms内存限制:32M 描述 一个屋子有 n 个开关控制着 n 盏灯,但奇怪的是,每个开关对应的不是一盏灯,而是 n-1 盏灯,每次按下这个开关,其对应 ...

  2. SGU 181 X-Sequence(一题比较水的求模找规律)

    E - X-Sequence Time Limit:500MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Submit ...

  3. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  4. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  5. SWUST OJ NBA Finals(0649)

    NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128   Descri ...

  6. eayui grid 每一页的行号都是从1开始

    问题背景: easyui 需要显示行号的时候,我们只需要设置  rownumbers: true, 但是 不管是在哪一页,行号都是从1开始,不能连续 我们在分页的 onSelectPage 函数里去执 ...

  7. 那些10w+的公众号都在写什么?

    出于好奇,那些10w+的公众号都写了些什么,于是我写了几个脚本爬取了各行业Top的公众号文章,进行了关键词统计. 抓取数据.分析用到了3中语言:Node.js,Java,Python.废话不多说,直接 ...

  8. HDU 5703 Desert 水题 找规律

    已知有n个单位的水,问有几种方式把这些水喝完,每天至少喝1个单位的水,而且每天喝的水的单位为整数.看上去挺复杂要跑循环,但其实上,列举几种情况之后就会发现是找规律的题了= =都是2的n-1次方,而且这 ...

  9. HDU 4572 Bottles Arrangement(找规律,仔细读题)

    题目 //找规律,123321123321123321…发现这样排列恰好可以错开 // 其中注意题中数据范围: M是行,N是列,3 <= N < 2×M //则猜测:m,m,m-1,m-1 ...

随机推荐

  1. [LeetCode]题解(python):133-Clone Graph

    题目来源: https://leetcode.com/problems/clone-graph/ 题意分析: 克隆一个无向图.每个节点包括一个数值和它的邻居. 题目思路: 直接深度拷贝. 代码(pyt ...

  2. python --appium搭建环境过程 ---新手总结(大牛勿喷,新手互相交流)

    首先安装python 安装包:https://yunpan.cn/cSdYZqjJ4xDZ3  访问密码 4bf9 1.安装pip   cd 到pip安装包  python setup.py inst ...

  3. 删除Mac中所有 .DS_Store 隐藏文件

    删除Mac中所有 .DS_Store 隐藏文件 35•36509感谢 longago 分享于 2012-07-06 12:01|只看该作者|倒序浏览|打印 Safari 5.1.7 Mac OS X ...

  4. .net mvc RazorEngine 字符串razor参数替换

    在.net中有一个比较好的字符串参数替换的方案RazorEngine推荐大家看看原网站,然后做个小联系然后你就懂啦 首先呢得下载一个吧, vs中tools-> Library Paging Ma ...

  5. 帝国cms后台 不同栏目发布字段不同

    在同一数据表下的两个栏目,由于功能不同,也需要建立不同的字段,问题是建立完不同字段后,其数据表下的两个栏目都有发布字段.这里教大家,不同栏目下发布内容,不同字段.修改数据模型中 录入表单模板 代码.底 ...

  6. Tomcat+redis+nginx配置

    为客户开发的一个绩效系统,采用了java web的开发方式,使用了一些spring mvc, mybatis之类的框架.相比于oracle ebs的二次开发,这种开发更加灵活,虽然和ebs集成的时候遇 ...

  7. html文件中文在浏览器中显示乱码问题解决

    利用浏览器打开html文件时,中文显示乱码,如下是原文件的内容 1 <html>   2         <head>   3             <title> ...

  8. HDU 2815 Mod Tree

    不会,先搁着…… http://blog.csdn.net/acm_cxlove/article/details/7832197

  9. android基础篇------------java基础(12)(多线程操作)

    <一>基本概念理解 1.什么是进程? 进程就是在某种程度上相互隔离,独立运行的程序.一般来说,系统都是支持多进程操作的,这所谓的多进程就是让系统好像同时运行多个程序. 2.什么是线程呢? ...

  10. Linux相关问题-CentOS6.5 x64版本号下Tomcat无法自启动的解决的方法

    前段时间使用阿里云server.使用的是Linux CentOS6.5系统,在搭建完Tomcat后发现,Tomcat无法自启动. 将启动tomcat的命令为tomcat_home/bin/startu ...