Форум программистов, компьютерный форум, киберфорум
alhaos
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

[golang] 12. Integer to Roman

Запись от alhaos размещена 23.02.2025 в 12:37
Показов 2408 Комментарии 1
Метки go, problem

Целое число необходимо перевести в строку соответствующего числа в Римской системе счисления

Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// [url]https://leetcode.com/studyplan/top-interview-150/[/url]
 
package topInterview
 
import (
    "bytes"
 
// intToRoman
//
// 12. Integer to Roman
//
// Seven different symbols represent Roman numerals with the following values:
//
// Symbol      Value
// I     1
// V     5
// X     10
// L     50
// C     100
// D     500
// M     1000
// Roman numerals are formed by appending the conversions of decimal place values from highest to lowest. Converting a decimal place value into a Roman numeral has the following rules:
//
// If the value does not start with 4 or 9, select the symbol of the maximal value that can be subtracted from the input, append that symbol to the result, subtract its value, and convert the // remainder to a Roman numeral.
// If the value starts with 4 or 9 use the subtractive form representing one symbol subtracted from the following symbol, for example, 4 is 1 (I) less than 5 (V): IV and 9 is 1 (I) less than 10 // (X): IX. Only the following subtractive forms are used: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) and 900 (CM).
// Only powers of 10 (I, X, C, M) can be appended consecutively at most 3 times to represent multiples of 10. You cannot append 5 (V), 50 (L), or 500 (D) multiple times. If you need to append a // symbol 4 times use the subtractive form.
// Given an integer, convert it to a Roman numeral.
//
// Example 1:
//
// Input: num = 3749
//
// Output: "MMMDCCXLIX"
//
// Explanation:
//
// 3000 = MMM as 1000 (M) + 1000 (M) + 1000 (M)
//
//  700 = DCC as 500 (D) + 100 (C) + 100 (C)
//   40 = XL as 10 (X) less of 50 (L)
//    9 = IX as 1 (I) less of 10 (X)
//
// Note: 49 is not 1 (I) less of 50 (L) because the conversion is based on decimal places
// Example 2:
//
// Input: num = 58
//
// Output: "LVIII"
//
// Explanation:
//
// 50 = L
//
//  8 = VIII
//
// Example 3:
//
// Input: num = 1994
//
// Output: "MCMXCIV"
//
// Explanation:
//
// 1000 = M
//
//  900 = CM
//   90 = XC
//    4 = IV
//
// Constraints:
//
// 1 <= num <= 3999//
func intToRoman(num int) string {
 
    // Инициировать буфер для сбора римских цифр
    b := bytes.Buffer{}
 
    // Повторять цикл пока num > 0
    for num > 0 {
        // В конструкции switch будем определять какое максимально возможное число мы можем вычесть
        // В каждом случае, добавляем соответствующую римскую цифру и уменьшаем num на соответствующее число
        // пока от num ничего не останется
        switch {
        case num >= 1000:
            b.WriteString("M")
            num -= 1000
        case num >= 900:
            b.WriteString("CM")
            num -= 900
        case num >= 500:
            b.WriteString("D")
            num -= 500
        case num >= 400:
            b.WriteString("CD")
            num -= 400
        case num >= 100:
            b.WriteString("C")
            num -= 100
        case num >= 90:
            b.WriteString("XC")
            num -= 90
        case num >= 50:
            b.WriteString("L")
            num -= 50
        case num >= 40:
            b.WriteString("XL")
            num -= 40
        case num >= 10:
            b.WriteString("X")
            num -= 10
        case num >= 9:
            b.WriteString("IX")
            num -= 9
        case num >= 5:
            b.WriteString("V")
            num -= 5
        case num >= 4:
            b.WriteString("IV")
            num -= 4
        case num >= 1:
            b.WriteString("I")
            num -= 1
        }
    }
    // Выводим строку полученную из буфера 
    return b.String()
}
Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
func TestIntToRoman(t *testing.T) {
 
    data := []struct {
        num      int
        expected string
    }{
        {3749, "MMMDCCXLIX"},
        {58, "LVIII"},
        {1994, "MCMXCIV"},
    }
 
    for i, datum := range data {
        result := intToRoman(datum.num)
 
        if result != datum.expected {
            t.Errorf(
                "unexpected result for test data index %d (%d), expected [%s], but got [%s]",
                i,
                datum.num,
                datum.expected,
                result,
            )
        }
    }
}
Code
1
2
3
=== RUN   TestIntToRoman
--- PASS: TestIntToRoman (0.00s)
PASS
Метки go, problem
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для alhaos
    Обратите внимание на особенность поведения конструкции switch в golang, она прерывается при нахождении первого положительного кейса. Чаще это удобно чем нет. Это поведение можно изменить применив команду fallthrough в сработавшем кейсе.
    Запись от alhaos размещена 23.02.2025 в 12:46 alhaos вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru