Java实现整数互转罗马数字基本算法

news2024/12/23 11:52:04

目录

一、罗马数字的起源? 

二、算法代码

(1)整数转罗马数字算法代码

(2)罗马数字转整数算法代码

三、测试结果

(1)整数转罗马数字测试结果

(2)罗马数字转整数测试结果 


一、罗马数字的起源? 

罗马数字比阿拉伯数字早 2000 多年,起源于古罗马。
大约在两千五百年前,罗马人还处在文化发展的初期,当时他们用手指作为计算工具。为了表示一、二、三、四个物体,就分别伸出一、二、三、四个手指;表示五个物体就伸出一只手;表示十个物体就伸出两只手。这种习惯人类一直沿用到今天。人们在交谈中,往往就是运用这样的手势来表示数字的。
当时,罗马人为了记录这些数字,便在羊皮上画出 Ⅰ、Ⅱ、Ⅲ 来代替手指的数;要表示一只手时,就写成“Ⅴ”形,表示大指与食指张开的形状;表示两只手时,就画成“ⅤⅤ”形,后来又写成一只手向上、一只手向下的“Ⅹ”,这就是罗马数字的雏形。
后来为了表示较大的数,罗马人用符号 C 表示一百。C 是拉丁文“centum”的头一个字母,centum 就是一百的意思(英文“century”就是由此而来)。用符号 M 表示一千。M 是拉丁文“mille”的头一个字母,mille 就是一千的意思。取字母 C 的一半,成为符号 L,表示五十。用字母 D 表示五百。若在数的上面画一横线,这个数就扩大一千倍。这样,罗马数字就有下面七个基本符号:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000)。罗马数字与十进位数字的意义不同,它没有表示零的数字,与进位制无关。所以当时的人们表示0用空格表示。

二、算法代码

(1)整数转罗马数字算法代码

package learnProject.csdn;

import java.util.Random;

/**
 * 
 * @author Roc-xb
 *
 */
public class IntegerToRoman {

	private static int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
	private static String[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };

	public static String intToRoman(int num) {
		StringBuilder sb = new StringBuilder();
		int i = 0;
		while (num > 0) {
			if (num >= values[i]) {
				sb.append(symbols[i]);
				num -= values[i];
			} else {
				i++;
			}
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		for (int num = 1; num <= 100; num++) {
			// 随机测试
			int randomInt = new Random().nextInt(1000);
			System.out.println(String.format("整数【%d】用罗马数字表示:%s", randomInt, intToRoman(randomInt)));
		}

	}
}

(2)罗马数字转整数算法代码

package learnProject.csdn;

public class RomanToInteger {

	  public static int romanToInt(String s) {
	        int result = 0;
	        int prevValue = 0;

	        for (int i = s.length() - 1; i >= 0; i--) {
	            char c = s.charAt(i);
	            int currValue = getRomanValue(c);

	            if (currValue < prevValue) {
	                result -= currValue;
	            } else {
	                result += currValue;
	            }

	            prevValue = currValue;
	        }

	        return result;
	    }

	    public static int getRomanValue(char c) {
	        switch (c) {
	            case 'I':
	                return 1;
	            case 'V':
	                return 5;
	            case 'X':
	                return 10;
	            case 'L':
	                return 50;
	            case 'C':
	                return 100;
	            case 'D':
	                return 500;
	            case 'M':
	                return 1000;
	            default:
	                return 0;
	        }
	    }

	    public static void main(String[] args) {
	        String roman = "DCCLXXXVIII";
	        int num = romanToInt(roman);
	        System.out.println(String.format("%s罗马数字转换成整数为:%d",roman, num));
	    }
}

三、测试结果

(1)整数转罗马数字测试结果

整数【260】用罗马数字表示:CCLX
整数【806】用罗马数字表示:DCCCVI
整数【652】用罗马数字表示:DCLII
整数【814】用罗马数字表示:DCCCXIV
整数【539】用罗马数字表示:DXXXIX
整数【456】用罗马数字表示:CDLVI
整数【788】用罗马数字表示:DCCLXXXVIII
整数【613】用罗马数字表示:DCXIII
整数【756】用罗马数字表示:DCCLVI
整数【235】用罗马数字表示:CCXXXV
整数【281】用罗马数字表示:CCLXXXI
整数【27】用罗马数字表示:XXVII
整数【389】用罗马数字表示:CCCLXXXIX
整数【138】用罗马数字表示:CXXXVIII
整数【387】用罗马数字表示:CCCLXXXVII
整数【927】用罗马数字表示:CMXXVII
整数【712】用罗马数字表示:DCCXII
整数【291】用罗马数字表示:CCXCI
整数【328】用罗马数字表示:CCCXXVIII
整数【955】用罗马数字表示:CMLV
整数【104】用罗马数字表示:CIV
整数【754】用罗马数字表示:DCCLIV
整数【511】用罗马数字表示:DXI
整数【256】用罗马数字表示:CCLVI
整数【755】用罗马数字表示:DCCLV
整数【938】用罗马数字表示:CMXXXVIII
整数【9】用罗马数字表示:IX
整数【501】用罗马数字表示:DI
整数【238】用罗马数字表示:CCXXXVIII
整数【465】用罗马数字表示:CDLXV
整数【853】用罗马数字表示:DCCCLIII
整数【771】用罗马数字表示:DCCLXXI
整数【271】用罗马数字表示:CCLXXI
整数【189】用罗马数字表示:CLXXXIX
整数【561】用罗马数字表示:DLXI
整数【427】用罗马数字表示:CDXXVII
整数【561】用罗马数字表示:DLXI
整数【255】用罗马数字表示:CCLV
整数【935】用罗马数字表示:CMXXXV
整数【513】用罗马数字表示:DXIII
整数【956】用罗马数字表示:CMLVI
整数【900】用罗马数字表示:CM
整数【337】用罗马数字表示:CCCXXXVII
整数【630】用罗马数字表示:DCXXX
整数【19】用罗马数字表示:XIX
整数【328】用罗马数字表示:CCCXXVIII
整数【119】用罗马数字表示:CXIX
整数【619】用罗马数字表示:DCXIX
整数【83】用罗马数字表示:LXXXIII
整数【161】用罗马数字表示:CLXI
整数【28】用罗马数字表示:XXVIII
整数【930】用罗马数字表示:CMXXX
整数【622】用罗马数字表示:DCXXII
整数【692】用罗马数字表示:DCXCII
整数【79】用罗马数字表示:LXXIX
整数【785】用罗马数字表示:DCCLXXXV
整数【862】用罗马数字表示:DCCCLXII
整数【216】用罗马数字表示:CCXVI
整数【646】用罗马数字表示:DCXLVI
整数【704】用罗马数字表示:DCCIV
整数【785】用罗马数字表示:DCCLXXXV
整数【115】用罗马数字表示:CXV
整数【127】用罗马数字表示:CXXVII
整数【989】用罗马数字表示:CMLXXXIX
整数【624】用罗马数字表示:DCXXIV
整数【566】用罗马数字表示:DLXVI
整数【613】用罗马数字表示:DCXIII
整数【105】用罗马数字表示:CV
整数【782】用罗马数字表示:DCCLXXXII
整数【774】用罗马数字表示:DCCLXXIV
整数【664】用罗马数字表示:DCLXIV
整数【117】用罗马数字表示:CXVII
整数【115】用罗马数字表示:CXV
整数【981】用罗马数字表示:CMLXXXI
整数【11】用罗马数字表示:XI
整数【67】用罗马数字表示:LXVII
整数【510】用罗马数字表示:DX
整数【824】用罗马数字表示:DCCCXXIV
整数【850】用罗马数字表示:DCCCL
整数【79】用罗马数字表示:LXXIX
整数【735】用罗马数字表示:DCCXXXV
整数【496】用罗马数字表示:CDXCVI
整数【925】用罗马数字表示:CMXXV
整数【341】用罗马数字表示:CCCXLI
整数【238】用罗马数字表示:CCXXXVIII
整数【169】用罗马数字表示:CLXIX
整数【6】用罗马数字表示:VI
整数【856】用罗马数字表示:DCCCLVI
整数【625】用罗马数字表示:DCXXV
整数【397】用罗马数字表示:CCCXCVII
整数【457】用罗马数字表示:CDLVII
整数【448】用罗马数字表示:CDXLVIII
整数【441】用罗马数字表示:CDXLI
整数【47】用罗马数字表示:XLVII
整数【193】用罗马数字表示:CXCIII
整数【173】用罗马数字表示:CLXXIII
整数【33】用罗马数字表示:XXXIII
整数【263】用罗马数字表示:CCLXIII
整数【870】用罗马数字表示:DCCCLXX
整数【724】用罗马数字表示:DCCXXIV

(2)罗马数字转整数测试结果 

DCCLXXXVIII罗马数字转换成整数为:788

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

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

相关文章

GD32F103 硬件 IIC

1. 硬件IIC 1. 硬件IIC的框图 如果MCU做为主机SCL就做为输出&#xff0c;做从机SCL就做为输入。 主机&#xff1a; 当MCU作为主机发送数据流程从数据缓冲寄存器里拿到移位寄存器。在从移位寄存器一位一位发送。 当MCU作为主机接收数据流程先放到移位寄存器。在从移位寄存…

微信小程序软件著作权申请成功!

软件著作权登记是对自己开发的软件享有著作权的一种保障&#xff0c;也是对自己开发能力的一种认证&#xff0c;在个人找工作或者公司拿项目资质审查时都可能发挥作用。我成功开发了一款微信小程序后&#xff0c;便了解了许多相关资料&#xff0c;花钱请代理代办速度快、省事&a…

Visopsys 0.92 发布

Visopsys 是一个 PC 机的操作系统&#xff0c;系统小型、快速而且开源。有着丰富的图形界面、抢先式多任务机制以及支持虚拟内存。Visopsys 视图兼容很多操作系统&#xff0c;但并不是他们的克隆版本。Visopsys 0.92 现已发布&#xff0c;此维护版本引入了多任务处理程序、文件…

C++标准模板(STL)- 类型支持 (定宽整数类型)(int8_t,int_fast8_t,int_least8_t,intmax_t,intptr_t)

定宽整数类型 类型 定义于头文件 <cstdint> int8_tint16_tint32_tint64_t (可选) 分别为宽度恰为 8、16、32 和 64 位的有符号整数类型 无填充位并对负值使用补码 &#xff08;仅若实现支持该类型才提供&#xff09; (typedef) int_fast8_tint_fast16_tint_fast32_tint…

进程调度算法之先来先服务(FCFS),短作业优先(SJF)以及高响应比优先(HRRN)

1.先来先服务&#xff08;FCFS&#xff09; first come first service 1.算法思想 主要从“公平”的角度考虑(类似于我们生活中排队买东西的例子) 2.算法规则 按照作业/进程到达的先后顺序进行服务。 3.用于作业/进程调度 用于作业调度时&#xff0c;考虑的是哪个作业先…

Spring 原理

它是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 1 Spring 特点 轻量级控制反转面向切面容器框架集合 2 Spring 核心组件 3 Spring 常用模块 4 Spring 主要包 5 Spring 常用注解 bean…

【HTTP】URL结构、HTTP请求和响应的报文格式、HTTP请求的方法、常见的状态码、GET和POST有什么区别、Cookie、Session等重点知识汇总

目录 URL格式 HTTP请求和响应报文的字段&#xff1f; HTTP请求方法 常见的状态码 GET 和 POST 的区别 Cookie 和 Session URL格式 &#xff1f;&#xff1a;是用来分割URL的主体部分&#xff08;通常是路径&#xff09;和查询字符串&#xff08;query string&#xff09;…

MyBatisPlus(九)模糊查询

说明 模糊查询&#xff0c;对应SQL语句中的 like 语句&#xff0c;模糊匹配“要查询的内容”。 like /*** 查询用户列表&#xff0c; 查询条件&#xff1a;姓名包含 "J"*/Testvoid like() {String name "J";LambdaQueryWrapper<User> wrapper ne…

十天学完基础数据结构-第六天(树(Tree))

树的基本概念 树是一种层次性的数据结构&#xff0c;它由节点组成&#xff0c;这些节点按照层次关系相互连接。树具有以下基本概念&#xff1a; 根节点&#xff1a;树的顶部节点&#xff0c;没有父节点。 子节点&#xff1a;树中每个节点可以有零个或多个子节点。 叶节点&am…

力扣第102题 广度优先搜索 二叉数 c++

题目 102. 二叉树的层序遍历 中等 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20…

八大排序算法汇总(C语言实现)

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…

【1++的刷题系列】之双指针

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的刷题系列】 文章目录 一&#xff0c;什么是双指针二&#xff0c;相关例题例一例二例三例四例五 一&#xff0c;什么是双指针 常见的双指针有两种形式&#xff1a;一种是对撞指针&#xff08…

tinymce富文本编辑器【tip】

项目场景&#xff1a; tinymce富文本编辑器在iview的modal框中显示的问题 问题描述 最近在使用tinymceiviewvue写项目&#xff0c;在富文本编辑器配合弹框一起使用时&#xff0c;总是存在问题&#xff1a;弹框弹出的时候&#xff0c;富文本编辑器不能点击&#xff0c;鼠标的光…

【软考】PV 操作

#国庆发生的那些事儿# 临界资源: 诸进程间需要互斥方式对其进行共享的资源&#xff0c;如打印机、磁带机等临界区: 每个进程中访问临界资源的那段代码称为临界区信号量: 是一种特殊的变量。 信号量的值与相应资源的使用情况有关: ①: 当信号量的值大于0时&#xff0c;表示当…

Lucene学习总结之Lucene的索引文件格式

四、具体格式 上面曾经交代过&#xff0c;Lucene保存了从Index到Segment到Document到Field一直到Term的正向信息&#xff0c;也包括了从Term到Document映射的反向信息&#xff0c;还有其他一些Lucene特有的信息。下面对这三种信息一一介绍。 4.1. 正向信息 Index –> Seg…

Spring 体系架构模块和三大核心组件介绍

Spring架构图 模块介绍 1. Spring Core&#xff08;核心容器&#xff09;&#xff1a;提供了IOC,DI,Bean配置装载创建的核心实现。 spring-core &#xff1a;IOC和DI的基本实现 spring-beans&#xff1a;BeanFactory和Bean的装配管理(BeanFactory) spring-context&#xff1…

LLMs 用强化学习进行微调 RLHF: Fine-tuning with reinforcement learning

让我们把一切都整合在一起&#xff0c;看看您将如何在强化学习过程中使用奖励模型来更新LLM的权重&#xff0c;并生成与人对齐的模型。请记住&#xff0c;您希望从已经在您感兴趣的任务上表现良好的模型开始。您将努力使指导发现您的LLM对齐。首先&#xff0c;您将从提示数据集…

<C++> 模板-上

目录 前言 一、函数模板 1. 概念 2. 格式 3. 原理 4. 函数模板的实例化 4.1 隐式实例化 4.2 显示实例化 5. 模板参数的匹配原则 5.1 5.2 5.3 二、类模板 1. 类模板定义格式 2. 类模板的实例化 总结 前言 如何实现一个通用的函数&#xff0c;函数可以实现两个类型的交换&…

C++_pen_友元

友元&#xff08;破坏封装&#xff09; 我故意让别人能使用我的私有成员 友元类 friend class B;友元函数 friend void func();友元成员函数 friend void A::func();例 #include <stdio.h>class A;class C{ public:void CprintA(A &c); };class B{ public:void Bpri…

jira 浏览器插件在问题列表页快速编辑问题标题

jira-issueTable-quicker 这是一个可以帮助我们在问题表格页快速编辑问题的浏览器插件 github 地址 功能介绍 jira 不可否认是一个可以帮助有效提高工作效率的工具&#xff0c;但是我们在使用 jira 时使用问题表格可以让我们看到跟多的内容而不用关注细节&#xff0c;但是目…