第12题 数字转为罗马数字

罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。

一开始我按照10进制的思想来做,针对不同区间,编辑不同的罗马表达方式,比如1~9,10~90,100~900,1000~3000

以下是代码:

public static String intToRoman(int num) {

        //
        String roman = "";
        if(num<=0) return "";
        if(num<=10){
            String[] tens = new String[]{"I","II","III","IV","V","VI","VII","VIII","IX","X"};
            roman = roman+tens[num-1];

        }
        if(10<num && num<100){ //90以内都可以用I V X L表示
            String[] ten2nines = new String[] {"X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}; //10,20,30,40,50,60,70,80
            int H = ((int) (num/10));
            int L = num-H*10;
            roman = roman + ten2nines[H-1] + intToRoman(L);
        }

        if(100<=num && num<1000){
            String[] len = new String[] {"C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};//100,200,300,400,500,600,700,800,900
            int H = ((int) (num/100));
            int L = num-H*100;
            roman = roman + len[H-1] + intToRoman(L);
        }
        if(1000<=num && num <4000){
            String[] len = new String[] {"M","MM","MMM"};
            int H = ((int) (num/1000));
            int L = num-H*1000;
            System.out.println("H:"+H+",L:"+L);
            roman = roman + len[H-1] + intToRoman(L);
        }
        return roman;
    }

后来看到网上有一个简便的,先找到所有罗马数字的基,对于十进制,基为(1,2,3,4,5,6,7,8,9,10),罗马数字的基为("M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"),对应数字(1000,900,500,400,100,90,50,40,10,9,5,4,1)

以下为代码:

public static String intToRoman(int num) {
        String data[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        int value[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1}, base = -1;
        StringBuilder result = new StringBuilder();

        for(int i = 0;i < data.length;i++){
            if((base=num/value[i])!=0){
                while(base--!=0) result.append(data[i]);
                num=num%value[i];
            }
        }
        return result.toString();
}
时间: 2024-11-06 10:11:18

第12题 数字转为罗马数字的相关文章

LeetCode第12题 整数转罗马数字

/* 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII ,即为 X + II . 27 写做 XXVII, 即为 XX + V + II . 通常情况下,罗马数字中小的数字在大的数字的右边. 但也存在特例,例如 4 不写做 IIII,而是 IV.数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数

【Java】将数字转为汉字(中国钱币-数字转汉字)

今天做了一个题,需要把数字转为汉字,想了一段时间没有结果,于是在网上搜索出了如下方法: 1 package com.b510.number2char; 2 3 import java.math.BigDecimal; 4 5 /** 6 * 数字转换为汉语中人民币的大写<br> 7 * 8 * @author hongten 9 * @contact [email protected] 10 * @create 2013-08-13 11 */ 12 public class NumberTo

FreeCodeCamp之数字转罗马数字

将给定的数字转换成罗马数字.所有返回的 罗马数字 都应该是大写形式. convert(2) 应该返回 "II".convert(3) 应该返回 "III".convert(4) 应该返回 "IV".convert(5) 应该返回 "V".convert(9) 应该返回 "IX".convert(12) 应该返回 "XII".convert(16) 应该返回 "XVI"

PHP中数字转为百分位,千分位,万分位。。。

今天做项目中,需要将文章点击量显示在页面中,需求中给的是多少多少万,虽然不是什么难事,但做程序员这么久了,需要考虑的不再是简单的实现,而且有效率和快捷, 虽然PHP自带的函数有number_format()可以做到实现千分位,但我要的是万分位, 通过查找,发现了可以用以下这个方法: $num = 86231; # 将数字转为万分位 echo $num>10000?sprintf("%.1f", $num/10000):$num; 类似的通过这个方法,可以稍微修改下,就可以实现百分

蓝桥杯 六角形中填置1~12个数字 dfs

如图[1.png]所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. /**将12个数字放置到12个位置中,深度搜索,暴力枚举的方法*每放置一个数字,检查之前所放置位置的数字是否出现重复*当恰好放置12个数字并且六个边的和相同打印出所有的数字 */#include<stdio.h>#include<string.h>int t[6];int num[12

小学奥数读本(三年级),P133第12题

小学奥数读本(三年级),P133第12题. 用一到八,八个数,组成一道除法算式:口口口口÷口=口口口 这题有两个答案: 453*6=2718 582*3=1746 用pascal编程解决,解法一: 1 var 2 i,j:longint; 3 s:set of char; 4 st:string; 5 begin 6 for i:=123 to 987 do 7 for j:=1 to 8 do begin 8 s:=[]; 9 str(i,st); 10 s += [st[1]]+[st[2]

回溯法第1题—数字排列问题

[问题描述] 列出所有从数字1到数字n的连续自然数的排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入:n(1<=n<=9) 输出:由1~n组成的所有不重复的数字序列,每行一个序列. [样例输入] 3 [样例输出] 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 [问题分析] 这题要求输出n个数的全排列(从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列). 显然也没有什

velocity 将数字转为以万为单位,保留2位小数

$count = 123456789  -- 将数字转为以万为单位,保留2位小数 #set($per_count = ($count/100))   --  $count/100 返回值为 1234567 #set($per_count = ($count/100.00)) -- $count/100.00 返回值为 12345.67 $per_count 万

OCP-1Z0-051-题目解析-第12题

12. You need to produce a report where each customer's credit limit has been incremented by $1000. Inthe output, the customer's last name should have the heading Name and the incremented credit limitshould be labeled New Credit Limit. The column head