首页 > 编程语言 >C# 数字转罗马数字

C# 数字转罗马数字

时间:2024-06-18 19:31:02浏览次数:29  
标签:数字 nums C# value int 罗马数字 循环 result string

最近遇到一个需要整数转罗马数字的问题

罗马数字的规则:

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

字母从大到小依次排列,例如:8→XIII

但存在一种特殊情况,使得小字母在大字母右侧,来表示后者减去前者:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。


因此可以穷举出这几种情况,列为两个数组

再直接通过while暴力循环:

    public static string IntToRoman(int value)
    {
        int[] nums =new int[] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
        string[] romans = new string[]{ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
        string result = "";
        while (value > 0)
        {
            for(int i = 0, l = nums.Length; i < l; ++i)
            {
                if (value >= nums[i])
                {
                    value -= nums[i];
                    result += romans[i];
                    break;
                }
            }
        }

        return result;
    }

后面我思考了一下,当value与第X位相减时,value必不可能大于x-1位,因此可以加一个变量用来记录位置,降低无效的循环次数;

public static string IntToRoman(int value)
    {
        int[] nums =new int[] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
        string[] romans = new string[]{ "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
        string result = "";
        int start=0;
        while (value > 0)
        {
            for(int i = start, l = nums.Length; i < l; ++i)
            {
                if (value >= nums[i])
                {
                    value -= nums[i];
                    result += romans[i];
                    start = i;
                    break;
                }
            }
        }

        return result;
    }
输入:8
方法1:VIII 循环次数46
方法2:VIII 循环次数12
输入:1994
方法1:MCMXCIV 循环次数17
方法2:MCMXCIV 循环次数11
输入:3999
方法1:MMMCMXCIX 循环次数15
方法2:MMMCMXCIX 循环次数9

可见改过之后的写法在整个值域(1-3999)内都优于原写法

标签:数字,nums,C#,value,int,罗马数字,循环,result,string
From: https://blog.csdn.net/m0_69630773/article/details/139690579

相关文章

  • 在检视器Inspector中通过自定义属性实现显示中文名称
    在前人的基础上,整出来了一些完善一些的版本首先,在\Scripts下创建一个类CustomLabelAttribute usingSystem;usingUnityEngine;#ifUNITY_EDITOR[AttributeUsage(AttributeTargets.Field)]#endif///<summary>///使字段在Inspector中显示自定义的名称。///</summ......
  • 【C语言】数组参数和指针参数详解
    在写代码的时候难免要把【数组】或者【指针】传给函数,那函数的参数该如何设计呢?1一维数组传参#include<stdio.h>voidtest(intarr[])//ok?{}voidtest(intarr[10])//ok?{}voidtest(int*arr)//ok?{}voidtest2(int*arr[20])//ok?{}voidtest2(int**arr)//ok?......
  • Django框架入门必会三板斧,Django静态文件 static,Django有两种静态文件, Django框架
    ⅠDjango框架入门必会三板斧【一】Django项目如何添加新功能启动django项目之后如何添加更多的功能回想自己编写的web框架如果要添加功能就去urls.py和views.py【1】添加URL映射在项目的urls.py文件中,通过导入相应的应用(app)及其视图函数,并使用path()或include()......
  • Hexo博客Next主题更换cdn加速访问
    有时候访问我的博客时,总是会出现cdn.jsdelivr.net无法访问或者访问速度过慢的情况。我的博客园使用的是BNDong/Cnblogs-Theme-SimpleMemory主题,也遇到的这样的情况。经过我的一番折腾之后,将js文件转移到了我自己的OSS中,并且又经过了我的一番折腾之后,设置好了跨域资源共享(CORS)策略,......
  • simd example code
    Sure,hereisasimpleCexamplethatusesSIMD(SingleInstruction,MultipleData)instructionswithIntel'sSSE(StreamingSIMDExtensions)orAVX(AdvancedVectorExtensions)intrinsics.Thiscodemultipliestwoarraysoffloatselement-wiseusing......
  • uView的DatetimePicker组件在confirm回调中取不到v-model的最新值
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app,在uniapp生态中uView是其中非常好的全平台的第三方开源ui库,我在公司项目中果断的使用了它。我一个过滤弹窗有二个表单需要选择开始......
  • 解决VSCode中Debug和运行路径不一致
    哈喽,大家好,我是木头左!当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问题,可以在launch.json文件中配置CWD参数,以确保Debug和运行路径一致。配置launch.json文件launch.json文件是VSCode中用于配置调......
  • MybatisPlus之继承IService
    有一些简简单单的数据库增删改查还需要Service到Mapper一步步地来吗?答案是否定地,甚至代码都不用实现哦。这就是因为IService接口提供了一些基础功能的实现IService和ServiceImplIService只是一个接口,它并不能实现功能,如果你的service的接口继承它,继承过来的只是接口没有功......
  • ClickHouse 入门基本介绍
    一、简介官网:clickhouse.techClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。OLAP:联机分析处理,以ClickHouse等分析型数据库为代表,适合对数据进行一次插入多......
  • vector的特性及使用
    1、 vector的定义:单独定义一个vector的形式为:vector<typename>vector; 1.如上定义其实相当于一个大小可变化的序列容器,即变长数组。2.vector采用连续的储存空间来储存元素,意味着可以通过下标来访问元素,和数组一样高效,但是又比数组更优秀,它的大小是可以动态改变的,而且......