领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

字符串:用golang实现一个数字转罗马数字

nixiaole 2025-01-06 14:47:51 知识剖析 21 ℃

题目介绍如下:

七个不同的符号代表罗马数字,其值如下:

符号

I

1

V

5

X

10

L

50

C

100

D

500

M

1000


示例 1:

输入:num = 3749

输出: "MMMDCCXLIX"

解释:

3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
 700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
  40 = XL 由于 50 (L) 减 10 (X)
   9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位

示例 2:

输入:num = 58

输出:"LVIII"

解释:

50 = L
 8 = VIII

示例 3:

输入:num = 1994

输出:"MCMXCIV"

解释:

1000 = M
 900 = CM
  90 = XC
   4 = IV

我的实现算法完整代码如下

package main

import (
    "fmt"
    "strings"
    "testing"
)

// 定义整数到罗马数字的映射表和对应的值
var intToRomanMap = []struct {
    value  int
    symbol string
}{
    {1000, "M"},
    {900, "CM"},
    {500, "D"},
    {400, "CD"},
    {100, "C"},
    {90, "XC"},
    {50, "L"},
    {40, "XL"},
    {10, "X"},
    {9, "IX"},
    {5, "V"},
    {4, "IV"},
    {1, "I"},
}

func intToRoman(num int) string {
    var result strings.Builder

    // 从映射表中找到对应的罗马数字符号,并追加到结果中
    for _, pair := range intToRomanMap {
       for num >= pair.value {
          result.WriteString(pair.symbol)
          num -= pair.value
       }
       fmt.Println("num => ", num, result.String())
    }

    return result.String()
}

func TestInt2Lm(t *testing.T) {
    // 测试用例
    nums := []int{3749, 58}
    for _, num := range nums {
       fmt.Printf("整数 %d 转换为罗马数字是 %s\n", num, intToRoman(num))
    }
}
最近发表
标签列表