整数转换成罗马数字

2023-11-15

给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字。

如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等。

格式:

   第一行输入一个整数,接下来输出对应的罗马数字。


输入:123


输出:CXXIII



我的解法(较差,有六十多行代码):

#include <stdio.h>

int main()
{
	int num=0; //[1,3999]
	int thousand=0;
	int hundred=0;
	int ten=0;
	int unit=0;
	char* String_thousand[3]={"M","MM","MMM"};
	char* String_hundred[9]={"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
	char* String_ten[9]={"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
	char* String_unit[9]={"I","II","III","IV","V","VI","VII","VIII","IX"};
	char* String_Temp=NULL;
	scanf("%d",&num);
	
	thousand=num/1000;
	hundred=num/100-10*(num/1000);
	ten=num/10-10*(num/100);
	unit=num%1000%100%10;

//	printf("%d,%d,%d,%d\n",thousand,hundred,ten,unit);
	if(thousand!=0)
	{
		for(int i=0;i<3;i++)
		{
			if(thousand-1==i)
				String_Temp=String_thousand[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s",String_Temp);
	String_Temp=NULL;
	if(hundred!=0)
	{
		for(int i=0;i<9;i++)
		{
			if(hundred-1==i)
				String_Temp=String_hundred[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s",String_Temp);
	String_Temp=NULL;
	if(ten!=0)
	{
		for(int i=0;i<9;i++)
		{
			if(ten-1==i)
				String_Temp=String_ten[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s",String_Temp);
	String_Temp=NULL;
	if(unit!=0)
	{
		for(int i=0;i<9;i++)
		{
			if(unit-1==i)
				String_Temp=String_unit[i];
		}
	}
	if(String_Temp!=NULL)
		printf("%s\n",String_Temp);
	return 0;
}

  图一:



目前找到的最优解法(只有三十多行代码,比我的优化了一半):

#include <stdio.h>

void toRoman(int num)
{
    static char *roman[][10]={"","I","II","III","IV","V","VI","VII","VIII","IX",
                  "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
                  "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
                  "","M","MM","MMM"};
    int i, j, n;
    printf("%d = ", num);
    for(j = 0, i = 10000; j < 4; ++j, i/=10)
    {
        n = (num%i) / (i/10);
        printf("%s",roman[3-j][n]);
    }
    printf("\n");
}
 
int main()
{
    int n;
    printf("Please enter a decimal number (1-3999):");
    scanf("%d", &n);
    if(n < 1 || n > 3999)
    {
        printf("Illegal Parameter!\n");
        return 1;
    }
    toRoman(n);
     
    return 0;
}
图二:



经过分析,可以找到几点学习的地方:


1.我的程序中所构建的三个字符串数组,在最优解法中,直接构建成了一个二维数组。

2.我对于千,百,十,个位的数字获取太过复杂,最优解法只使用一个for循环即达到效果。

for(j = 0, i = 10000; j < 4; ++j, i/=10)
    {
        n = (num%i) / (i/10);
    }
3.我对于对应整数转换成罗马数字太过复杂,最优解法:

printf("%s",roman[3-j][n]);





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

整数转换成罗马数字 的相关文章

  • 信号槽的返回值(QMetaObject::invokeMethod的用法)——Qt

    前言 之前从未想过信号槽是可以有返回值的 因为虽然信号发出去了 但是它在事件循环中 什么时候执行还不一定 这个想法固然是对的 但是这也不是不能实现的 我查了网上的一些资料 发现差不多有一下三种方法 1 信号槽里加指针或引用 这个不推荐 隐患

随机推荐

  • 并发处理

    1 并发活动 进程的引入 操作系统的特性之一是并发与共享 即在系统中 内存 同时存在几个相互独立的程序 这些程序在系统中既交叉地运行 又要共享系统中的资源 这就会引起一系列的问题 包括 对资源的竞争 运行程序之间的通信 程序之间的合作与协同
  • 分布式锁的实现

    目录 分布式锁 分布式锁的引出 单体锁存在的问题 共享数据不安全 超卖现象 锁的理解 拓展 分流 拓展 分流Nginx简单理解 分布式锁的引出 分布式锁的设计思路 分布式锁的常见应用场景 分布式锁方案 数据库的分布式锁如何实现 Redis分
  • 《手把手教你》系列练习篇之4-python+ selenium自动化测试(详细教程)

    1 简介 今天我们继续前边的练习 学习和练习一下 如何使用webdriver方法获取当前测试页面的URL 如何获取当前页面的title 如何打开浏览器的一个新建页面 如何操作单选按钮等等 这些小练习 来巩固基础 2 webdriver方法获
  • WebGL 实践篇(二)—— 屏幕坐标与裁剪坐标,片段着色器中的颜色定义

    一 裁剪坐标系 canvas坐标系以及屏幕坐标系 裁剪坐标 WebGL坐标系 的范围 1 1 原点在中间 x正值向右 y正值向上 屏幕坐标 原点在左上角 x正值向右 y正值向下 canvas坐标 与屏幕坐标相比 原点向右向下偏移 x y正值
  • 如何安装Jenkins并配置插件(清华源)

    Linux启动jenkins 将 jenkins war 放在 usr local jenkins 目录下 执行命令启动 Jenkins 1 nohup java jar jenkins war httpPort 8000 安装Jenkin
  • Gateway服务的搭建

    1 Gateway的作用 网关的核心功能特性 请求路由 权限控制 限流 架构图 权限控制 网关作为微服务入口 需要校验用户是是否有请求资格 如果没有则进行拦截 路由和负载均衡 一切请求都必须先经过gateway 但网关不处理业务 而是根据某
  • 微信公众号第三方平台开发,零基础入门。想学我教你啊

    在学习微信第三方平台开发之前你应该会的 1 常用接口测试工具的使用 postman 2 学会看第三方平台文档 这个很关键 不过很多还是喜欢百度 白嫖别人的操作文档 3 学习排查问题 分析问题 4 第三方平台的限制 和公众号 订阅号这些关系要
  • 前端node.js上传文件到服务器_从零开始: nodejs 搭建文件索引服务器(Part 1)

    在考虑要用nodejs搭建文件索引服务器来替代我原来那个笨重的Apache服务器 采用省心的bitnami lampstack搭建 然后配了背景图片和图标 之前 说实话我连javascript是什么都不清楚 所以 从语言上讲 确实是从零开始
  • 06-Redis缓存高可用集群

    上一篇 05 Redis高可用集群之水平扩展 1 集群方案比较 哨兵模式 在redis3 0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态 如果master节点异常 则会做主从切换 将某一台slave作为
  • JavaScript基础知识09——数据类型

    哈喽 大家好啊 这里是雷工笔记 我是雷工 数据类型比较常见 无论是对程序员 还是电气工程师来说 都再熟悉不过了 这里跟着教程了解一下 主要看跟自己以往在其他PLC C 组态软件中应用的有啥不同 一 了解数据类型 在计算机的世界就像黑客帝国中
  • 12306 APP 同一乘客、同列火车候补订单与硬座的处理规则!

    问题 国庆节没抢到回家的火车票 候补了该列车的卧铺 怕候补不到车票 又买了该列车的硬座 当候补订单候补到卧铺车票时 怎么处理 方案 结论 直接候补不成功 提示 XX 二代身份证 xxx 存在与本次购票行程冲突的车票
  • ctfshow- web1(50 point)

    0x00 前言 CTF 加解密合集 CTF Web合集 0x01 题目 0x02 Write Up 首先映入眼帘的是登录界面 尝试弱口令无果 可以注册 尝试注册一个账号 通过url发现这里是通过order by进行了排序 测试发现一共5个字
  • CSDN竞赛6期题解

    CSDN编程竞赛报名地址 https edu csdn net contest detail 16 请不要删掉此地址 总结 这次竞赛题目比较简单 没多大必要写题解 更多的还是给出自己的一些体会和建议吧 很多同学已经对比赛规则和编程体验给出了
  • 使用mod_deflate模块压缩页面优化传输速度

    在HTTPD主配置文件中添加如下 并确保deflate模块是启用的 vim etc httpd conf httpd conf SetOutputFilter DEFLATE 调用一个叫DEFLATE输出过滤器 mod deflate co
  • 信息与网络安全基础知识汇总

    一 概述 1 网络信息安全基本概念 信息安全 是指信息网络中的硬件 软件及其系统中的数据受到保护 不受偶然的或者恶意的原因而遭到破坏 更改 泄露 否认等 系统连续可靠正常的运行 信息服务不中断 密码学 是结合数学 计算机科学 电子与通信等学
  • Linux的find命令

    一 find语法 find path option print exec ok command find 路径 参数 二 使用 通过文件名查找 find name 文件名 find etc name passwd 查找 etc目录下的pas
  • easychat项目讲解

    项目简介 本项目是基于Websocket和Servlet实现的多用户聊天室 实现了聊天所需的一些基本功能 功能描述 1 用户信息注册 2 登录 同时标识上 下线用户 3 私聊 点击好友列表中指定用户进行私聊 4 群聊 点击好友列表指定用户建
  • 2023最新ELK搭建教程,基于ES 8

    一 ELK介绍 ELK的应用 ELK的应用场景 日志查询 问题排查 上线检查服务器监控 应用监控 错误报警Bug管理性能分析 用户行为分析 安全漏洞分析 企业 行业 ELK用途 阿里巴巴 电子商务 云计算 用于日志管理和实时监控 腾讯 互联
  • 蓝桥杯客观题知识点

    一 异步和同步的在于 有无统一的时钟信号 异步无 同步有 RS485 半双工 异步 串行 差分输入 多级通信 USB 键盘等外设 RS232 全双工 异步 串行 单端输入 一对一通信 二 组合逻辑电路和时序逻辑电路的区别 组合 任意时刻的输
  • 整数转换成罗马数字

    给定一个整数num 1 lt num lt 3999 将整数转换成罗马数字 如1 2 3 4 5对应的罗马数字分别位I II III IV V等 格式 第一行输入一个整数 接下来输出对应的罗马数字 输入 123 输出 CXXIII 我的解法