罗马数字


    古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!

    罗马数字的表示主要依赖以下几个基本符号:

    I  1
    V  5
    X  10
    L  50
    C  100
    D  500
    M  1000

    这里,我们只介绍一下1000以内的数字的表示法。

    单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300  XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。

    如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9  IV表示4  XL表示40
    49 = XLIX
    更多的示例参见下表,你找到规律了吗?
    
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9

X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99

C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999

    本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

    输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。

    要求程序输出n行,就是罗马数字对应的十进制数据。

    例如,用户输入:
3
LXXX
XCIII
DCCII

    则程序应该输出:
80
93
702

/*
方法一
*/
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();String[] a = new String[n];for (int i = 0; i < n; i++)a[i] = sc.next();sc.close();for (int i = 0; i < n; i++)System.out.println(check(a[i]));}static int check(String s) {char[] chars = s.toCharArray();int N = 0;for (int i = 0; i < chars.length;) {int t = 0;if (i == chars.length - 1) {t = f(chars[i]);i++;}if (i + 1 < chars.length)if (isIXCM(chars[i])) {int count = 1;int j = i+1;while (j < chars.length && chars[i] == chars[j] && count <= 3) {count++;j++;}if (count > 1) {t = f(chars[i]) * count;i += count;} else if (count == 1) {if (f(chars[i]) < f(chars[i + 1])) {t = f(chars[i + 1]) - f(chars[i]);i += 2;} else if (f(chars[i]) >= f(chars[i + 1])) {t = f(chars[i]);i++;}}} else {if (f(chars[i]) < f(chars[i + 1])) {t = f(chars[i + 1]) - f(chars[i]);i += 2;} else if (f(chars[i]) >= f(chars[i + 1])) {t = f(chars[i]);i++;}}N += t;}return N;}static boolean isIXCM(char c) {return c == 'I' || c == 'X' || c == 'C' || c == 'M';}static int f(char c) {int n = 0;switch (c) {case 'I':n = 1;break;case 'V':n = 5;break;case 'X':n = 10;break;case 'L':n = 50;break;case 'C':n = 100;break;case 'D':n = 500;break;case 'M':n = 1000;break;}return n;}}
/*
方法二:建立一个表,每两个字符匹配
*/import java.util.Scanner;public class Test2 {static int[][] table;static int M = 7, N = 7;public static void main(String[] args) {createTable();Scanner sc = new Scanner(System.in);int n = sc.nextInt();String[] a = new String[n];for (int i = 0; i < n; i++)a[i] = sc.next();sc.close();createTable();for (int i = 0; i < n; i++)System.out.println(check(a[i]));}static int check(String s) {char[] chars = s.toCharArray();int T = 0;int i = 0;while (i + 1 < chars.length) {T += table[charToIndex(chars[i])][charToIndex(chars[i + 1])];i += 2;}if (i == chars.length - 1)T += charToInt(chars[i]);return T;}static void createTable() {table = new int[M][N];for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {table[i][j] = f3(i, j);}}}static int f3(int i, int j) {int t1 = charToInt(indexToChar(i)), t2 = charToInt(indexToChar(j));if (t2 > t1) {return t2 - t1;}return t1 + t2;}static int charToInt(char c) {int n = 0;switch (c) {case 'I': n = 1;break;case 'V': n = 5;break;case 'X': n = 10;break;case 'L': n = 50;break;case 'C': n = 100;break;case 'D': n = 500;break;case 'M': n = 1000;break;}return n;}static char indexToChar(int i){switch (i){case 0:return 'I';case 1:return 'V';case 2:return 'X';case 3:return 'L';case 4:return 'C';case 5:return 'D';}return 'M';}static int charToIndex(char c){switch (c){case 'I':return 0;case 'V':return 1;case 'X':return 2;case 'L':return 3;case 'C':return 4;case 'D':return 5;}return 6;}
}

 

转载于:https://www.cnblogs.com/Alpharun/p/8676202.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编 --- 从磁盘(扇区2到18)上读取数据到内存中

下面代码读取柱面:0,磁头:0,扇区从2到18的数据到内存 0x8200~0xa3ff处 需要明白以下几点: 给定柱面,磁头,一个扇形区域是512字节,对应的物理可以理解为512个灯泡组(一个灯泡组有8个小灯泡)确定读取到内存中的位置 为什么是0x8200:因为0x8000~0x81ff这512个字节要留给启动区.为…

那些值得思考的PHP问题

那些值得思考的PHP问题 1、关于弱类型 函数strpos是返回字符串str2在str1的位置&#xff0c;没有找到则返回false&#xff0c;然而如果在实际应用上返回的位置是0&#xff0c;在if语句中0也被当作false&#xff0c;所以我们需要对false做类型判断&#xff0c; $str1 yabadaba…

Lvs Tun隧道模式配置

######## TUN是IP Tunneling &#xff0c;IP隧道的简称&#xff0c;它将调度器收到的IP数据包封装在一个新的IP数据包中&#xff0c;转交给应用服务器&#xff0c;然后实际服务器的返回数据会直接返回给用户。 工作原理&#xff1a; 用户请求负载均衡服务器&#xff0c;当IP数…

mysql-常用sql

记录下工作中常用的sql 删除重复数据 delete from student where id not in (select min(id) from student group by name); -- 该语句在mysql下会报错&#xff0c; -- 执行报错&#xff1a;1093 - You cant specify target table student for update in FROM clause -- 原因是…

优雅的使用Laravel之phpstorm配置

优雅的使用Laravel之phpstorm配置 先打开一个Laravel 项目&#xff0c;然后在project tool 窗口选择根节点、然后右键->Composer | Init composer 。 如果你的电脑里没有composer.phar&#xff0c;可以点击链接来下载。然后点击项目 composer->add denpendency.. 搜索ba…

算法 --- 求两个集合的并集

const unionL (l1, l2)>{for(let i0; i <l1.length; i){if(l2.indexOf(l1[i]) -1){l2.push(l1[i])}}return l2 }let l1 [1,2,3,4]; let l2 [1,2,5]; console.log(unionL(l1,l2)); //[1, 2, 5, 3, 4]

java实验四——找鞍点

package hello;public class 实验四 {public static void main(String[] args) {// TODO Auto-generated method stubint[][] a {{9,8,6},{2,3,1},{8,5,2}};System.out.println("二维数组为&#xff1a;");for(int i0;i<a.length;i){for(int j0;j<a[i].length;…

BZOJ 4551树题解

好吧&#xff0c;洛谷的数据比较水暴力就可以过。。。。&#xff08;而且跑到飞快&#xff09; 不过&#xff08;BZ水不过去&#xff09;还是讲讲正规的做法。 其实一眼可以看出可以树剖&#xff0c;但是&#xff0c;码起来有点麻烦。 其实有一种更简单的离线做法。 我们很容易…

es6 --- 使用Symbol保护私有变量

定义一个人物类 假设其属性有姓名和性别我们希望,性别在声明后就固定不变 传统方法 var Person (function(){var _gender ;function P(name, gender){this.name name;_gender gender;}P.prototype.getGender function(){return _gender;}return P; })();var p1 new Pe…

组合数

long long factorial(int n) {long long m 1;for(int i1;i<n;i)m*i;return m; } long long C(int n,int m) {return factorial(n)/(factorial(m)*factorial(n-m));//可能会溢出 } 正解&#xff1a; long long C(int n,int m) {if(m<n-m) m n-m;long long ans 1;for(in…

Mysql中的联合索引、前缀索引、覆盖索引

Mysql中的联合索引、前缀索引、覆盖索引 索引 索引是一种特殊的文件&#xff0c;它们包含着对数据表里所有记录的引用指针。更通俗的说&#xff0c;数据库索引好比是一本书前面的目录&#xff0c;能加快数据库的查询速度。 联合索引 又名复合索引&#xff0c;由两个或多个列…

LVM逻辑卷管理

什么是逻辑卷&#xff1f;因为可以将文件系统像卷一样伸长或缩短之故。 LVM做法&#xff0c;将几个物理分区或磁盘&#xff0c;通过软件组合成为一块看起来是独立的大磁盘&#xff08;VG&#xff09;&#xff0c;然后将这块大磁盘再经过分成可使用分区&#xff08;LV&#xff0…

es6 --- 自制迭代器

对象 对象如下 const obj {left: 100,top: 200 }不可迭代 for(let attr of obj){console.log(attr); }迭代规则 可迭代,所具有的属性[Symbol.iterator] 需要自己给obj添加迭代规则 obj[Symbol.iterator] () >{// 获取obj的所有键let keys Object.keys(obj);let len …

软件工程的实践项目课程的自我目标

对实践项目完成后学习到的能力的预期&#xff1a;这算是自己第一次参加的团队合作的软件实践吧&#xff0c;以前自己搞的小“玩意”&#xff0c;实难登大雅之堂&#xff0c;期待实践项目后--->1、自己的代码能力能够有较明显的提高&#xff0c;代码更加规范。 2、提升团队合…

[Shell] swoole_timer_tick 与 crontab 实现定时任务和监控

手动完成 "任务" 和 "监控" 主要有下面三步&#xff1a; 1. mission_cron.php&#xff08;定时自动任务脚本&#xff09;&#xff1a; <?php /*** 自动任务 定时器 (5s 执行).** swoole_timer_tick 解决秒级定时&#xff1b;* 如需调整&#xff0c;注意…

关于项目调研

一、柠檬时代app 1、作品内容&#xff1a; 该作品主要为每一所高校的大学生量身定制的手机生活助手&#xff0c;由您自主运营的校园手机客户端。开放的自定义平台&#xff0c;汇聚本校周边所有生活服务、外卖商家、娱乐休闲、新鲜事儿、知名社团、周边商铺、校园达人等栏目。 …

html 标签

html概述 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。HTML是一种基础技术&#xff0c;常与CSS、JavaScript一起被众多网站用于设计令人赏心悦目的网页、网页应用程序…

es6 --- forEach的实现

forEach的第一个参数 接收回调函数 let a [a, b, c]; a.forEach((v, k ,s)>{console.log(v, k ,s);console.log(this); })v: valuek: keys: 代表数组a本身this指向当前函数执行所在的作用域,即window forEach的第二个参数. forEach第1个参数用于接收回调函数,第2个参数…

java Calendar

1.1 Calendar类概念 Calendar是日历类&#xff0c;在Date后出现&#xff0c;替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量&#xff0c;方便获取。 Calendar为抽象类&#xff0c;由于语言敏感性&#xff0c;Calendar类在创建对象时并非直接创建&…

结对项目之需求分析与原型设计

结对项目之需求分析与原型设计 031402317 李佳恺 031402511 黄家俊 这是我们两个人第一次合作&#xff0c;虽然结对是栋哥帮我们分配的&#xff0c;并且一开始我们就认识&#xff0c;但是也很开心有这个机会能一起合作完成任务。 初步分工我负责随笔&#xff0c;家俊负责原型设…