Римские цифры были изобретены еще в древнем Риме, и были широко исполняемы в различных сферах римской жизни, включая торговлю, архитектуру и календарь. Римляне использовали комбинацию разных букв для обозначения чисел, и каждая буква имела свою числовую ценность. Например, I равняется 1, V равняется 5, X равняется 10, L равняется 50, C равняется 100, D равняется 500, и M равняется 1000.
Чтобы создать калькулятор для римских цифр на Golang, мы будем использовать следующие шаги:
Шаг 1: Ввод пользователем двух римских чисел
Калькулятор будет принимать два числа, которые пользователь введет в строке – например, "VIII + III". Мы можем использовать функцию Scanln из библиотеки fmt для получения строки пользовательского ввода.
fmt.Scanln(&input)
Шаг 2: Разделение чисел и оператора
Мы можем разделить строку пользователя на три части: первое число, оператор и второе число, используя функцию Split из библиотеки strings:
parts := strings.Split(input, " ")
Часть parts[0] будет содержать первое число (например, "VIII"), parts[1] будет содержать оператор (например, "+"), а часть parts[2] будет содержать второе число (например, "III").
Шаг 3: Перевод римских чисел в арабские
Для того чтобы произвести операцию с римскими числами, мы сначала должны перевести их в арабские числа. Мы можем использовать карту значений для этого, к примеру:
var romanToArabic = map[string]int{
"I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000,
}
Для этого мы можем создать функцию, которая будет брать римское число в качестве входных данных и возвращать соответствующее арабское число:
func romanToArabic(romanNum string) int {
result := 0
for i := 0; i < len(romanNum); i++ {
current := romanToArabic[string(romanNum[i])]
if i+1 < len(romanNum) {
next := romanToArabic[string(romanNum[i+1])]
if current < next {
result -= current
} else {
result += current
}
} else {
result += current
}
}
return result
}
Шаг 4: Выполнение операции
Мы можем использовать оператор switch-case для выполнения операции, указанной в строке пользователя. Калькулятор может поддерживать операции сложения (+), вычитания (-), умножения (*) и деления (/). В качестве входных данных мы можем использовать арабские числа, полученные на предыдущем этапе.
var result int
switch parts[1] {
case "+":
result = romanToArabic(parts[0]) + romanToArabic(parts[2])
case "-":
result = romanToArabic(parts[0]) - romanToArabic(parts[2])
case "*":
result = romanToArabic(parts[0]) * romanToArabic(parts[2])
case "/":
result = romanToArabic(parts[0]) / romanToArabic(parts[2])
}
Шаг 5: Перевод результата в римскую систему
И наконец, мы можем использовать таблицу перевода, чтобы преобразовать полученный результат в римскую систему:
var arabicToRoman = map[int]string{
1: "I",
4: "IV",
5: "V",
9: "IX",
10: "X",
40: "XL",
50: "L",
90: "XC",
100: "C",
400: "CD",
500: "D",
900: "CM",
1000: "M",
}
var romanNum string
for result > 0 {
for _, key := range []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1} {
if result >= key {
result -= key
romanNum += arabicToRoman[key]
break
}
}
}
Итак, все вышеперечисленные шаги можно объединить в одну функцию, которая будет работать следующим образом:
package main
import (
"fmt"
"strings"
)
var romanToArabic = map[string]int{
"I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000,
}
var arabicToRoman = map[int]string{
1: "I",
4: "IV",
5: "V",
9: "IX",
10: "X",
40: "XL",
50: "L",
90: "XC",
100: "C",
400: "CD",
500: "D",
900: "CM",
1000: "M",
}
func romanToArabic(romanNum string) int {
result := 0
for i := 0; i < len(romanNum); i++ {
current := romanToArabic[string(romanNum[i])]
if i+1 < len(romanNum) {
next := romanToArabic[string(romanNum[i+1])]
if current < next {
result -= current
} else {
result += current
}
} else {
result += current
}
}
return result
}
func main() {
var input string
fmt.Println("Введите выражение в римских цифрах: ")
fmt.Scanln(&input)
parts := strings.Split(input, " ")
var result int
switch parts[1] {
case "+":
result = romanToArabic(parts[0]) + romanToArabic(parts[2])
case "-":
result = romanToArabic(parts[0]) - romanToArabic(parts[2])
case "*":
result = romanToArabic(parts[0]) * romanToArabic(parts[2])
case "/":
result = romanToArabic(parts[0]) / romanToArabic(parts[2])
}
var romanNum string
for result > 0 {
for _, key := range []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1} {
if result >= key {
result -= key
romanNum += arabicToRoman[key]
break
}
}
}
fmt.Println("Результат: ", romanNum)
}
Данный калькулятор может обрабатывать любые сочетания римских чисел и операторов, например:
Input:
VIII + III
Output:
Результат: XI
Input:
MCMXCVI - MCMLXXXVII
Output:
Результат: CIX
Input:
MMXIX * IX
Output:
Результат: XVIII
Input:
CXXIV / IV
Output:
Результат: XXXI
Таким образом, данная реализация калькулятора для римских чисел на Golang справляется с функцией преобразования римских цифр в арабские и наоборот, а также выполняет расчеты с обработкой операций сложения, вычитания, умножения и деления.