kotlin实现罗马数字和阿拉伯数字转换

原创 2015年07月08日 22:00:39

1.罗马数字转阿拉伯数字

遍历罗马数字的每一位,若当前位比前一位小,则在结果中加上当前位

否则在结果中减去前一位的两倍再加上当前位


2.阿拉伯数字转罗马数字

先构造map

mapOf(1000 to "M",900 to "CM",500 to "D",400 to "CD",100 to "C",90 to "XC",50 to "L",40 to "XL",10 to "X",9 to "IX",5 to "V",4 to "IV",1 to "I")
遍历map

若当前数字大于第i个数字

将第i个数字对应的字母加入结果中,当前数字-=第i个数字

val romeChar=mapOf(
        'I' to 1,
        'V' to 5,
        'X' to 10,
        'L' to 50,
        'C' to 100,
        'D' to 500,
        'M' to 1000
)


class RomeNumber private constructor(){
    constructor(number:String):this(){
        this.number=number
    }
    var number:String=""
        set(value){
            if(value.toCharList().any{!romeChar.containsKey(it)}) throw object :Exception("It is not a legal Rome Number"){ } else $number=value.toUpperCase()
        }
    public fun toArabicNumber():Int{
        var lastNumber=0
        var sum=0
        number.toCharList().forEach {
            var value:Int?=romeChar.get(it)
            if (value!!>lastNumber) {sum-=lastNumber*2;sum+=value;}else sum+=value
            lastNumber=value
        }
        return sum
    }

    override fun toString(): String {
        return number
    }
}


fun Int.toRomeNumber():RomeNumber{
    val additionMap = mapOf(1000 to "M",900 to "CM",500 to "D",400 to "CD",100 to "C",90 to "XC",50 to "L",40 to "XL",10 to "X",9 to "IX",5 to "V",4 to "IV",1 to "I")
    val sb=StringBuilder()
    var temp=this
    while (temp != 0) {
        additionMap.forEach {
            while (temp >= it.getKey()) {
                sb.append(it.getValue())
                temp -= it.getKey()
            }
        }
    }
    return RomeNumber(sb.toString())
}


相关文章推荐

python实现阿拉伯数字和罗马数字的互相转换

题目很简单,如果之前也做过这种题目的话,相信对于什么是罗马数字就不会很陌生了,罗马数字是很古老的计数方法,现在的一些地方还有见到它的使用,下面简单贴两张维基百科的图片简单回顾一下罗马数字: ...

对一个罗马数字与阿拉伯数字转换算法的分析

分析一个阿拉伯数字到罗马数字的转换算法。

Python 罗马数字与阿拉伯数字的转换

原文https://kingname.info/2014/12/29/%E5%AF%B9%E4%B8%80%E4%B8%AA%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97%E...

分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]

【本文链接】 http://www.cnblogs.com/hellogiser/p/roman-to-integer-and-integer-to-roman.html 【题目】 ...

罗马数字与阿拉伯数字相互转换

罗马数字规则简明 1. 罗马单个数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000) 2.一个罗马数字重复几次,就表示这个数的几倍。但同一数码...

经典题:罗马数字和阿拉伯数字的相互转换

package Linkedin; public class RomeToArabic { public static void main(String[] args) { String s...

Java经典题:罗马数字和阿拉伯数字的相互转换

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

罗马数字转换阿拉伯数字0~3999

这个题首先要知道的转换的规则,百度处了两条: 有两条须注意掌握: 1.基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放...
  • a197p
  • a197p
  • 2017年07月20日 10:27
  • 155

罗马数字和阿拉伯数字互化<java实现>

最近迷上了守望先锋,脑子一天不如一天,满脑子都是骚操作,所以闲的时候做一些ACM题目having some intellectual fun。然后就看到了这个:实现罗马数字与阿拉伯数字的互换。主要涉及...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kotlin实现罗马数字和阿拉伯数字转换
举报原因:
原因补充:

(最多只允许输入30个字)