DEV Community

Stella Achar Oiro
Stella Achar Oiro

Posted on

Converting Integers to Roman Numerals in Go

Roman numerals are a fascinating part of ancient history, representing numbers using combinations of letters from the Latin alphabet. Go's ToRoman function provides a modern way to convert integers into their corresponding Roman numeral representations. You'll learn the logic behind the ToRoman function, step by step, and how it efficiently performs this conversion.

Function Definition

The ToRoman function is defined as follows:

func ToRoman(num int) (string, string) {
    val := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
    sym := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}

    roman, calculation := "", ""

    for i := 0; i < len(val); i++ {
        for num >= val[i] {
            num -= val[i]
            roman += sym[i]
            if calculation != "" {
                calculation += "+"
            }
            calculation += sym[i]
        }
    }
    return roman, calculation
}
Enter fullscreen mode Exit fullscreen mode

Breakdown of the Function

  1. Initialization:

    val := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
    sym := []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
    

    Two slices, val and sym, are initialized to store Roman numeral values and their corresponding symbols. These slices are organized in descending order to facilitate the conversion process.

  2. Output Variables:

     roman, calculation := "", ""
    

    Two strings, roman and calculation, are initialized. roman will store the final Roman numeral representation, while calculation will store the step-by-step process.

  3. Conversion Logic:

     for i := 0; i < len(val); i++ {
         for num >= val[i] {
             num -= val[i]
             roman += sym[i]
             if calculation != "" {
                 calculation += "+"
             }
             calculation += sym[i]
         }
     }
    
  • Outer Loop: The outer loop iterates over the indices of the val and sym slices. This ensures that each value and symbol pair is processed.
  • Inner Loop: The inner loop repeatedly subtracts the current value (val[i]) from num while num is greater than or equal to val[i]. Each subtraction appends the corresponding Roman numeral symbol (sym[i]) to the roman string.
  • Building the Calculation String: If calculation is not empty, a + is appended before adding the current symbol. This builds a step-by-step representation of how the final Roman numeral is formed.

4.Return Statement:

```go
return roman, calculation
```
Enter fullscreen mode Exit fullscreen mode
Finally, the function returns the Roman numeral string and the calculation string.
Enter fullscreen mode Exit fullscreen mode

Example

Let's walk through an example to see how the ToRoman function works:

result, calc := ToRoman(1987)
fmt.Println("Roman Numeral:", result)
fmt.Println("Calculation Process:", calc)
Enter fullscreen mode Exit fullscreen mode

Output:

Roman Numeral: MCMLXXXVII
Calculation Process: M+CM+L+X+X+X+V+I+I
Enter fullscreen mode Exit fullscreen mode

For the input 1987:

  • The function starts with M (1000), subtracting it from 1987 to get 987.
  • Then CM (900) is subtracted, resulting in 87.
  • Next, L (50) is subtracted, leaving 37.
  • Three X (10 each) are subtracted, resulting in 7.
  • Finally, V (5) and two I (1 each) complete the conversion.

Conclusion

The ToRoman function is an efficient way to convert integers to Roman numerals in Go. Using slices to store values and symbols, and nested loops to perform the conversion, ensures accuracy and clarity in its output. Whether you're a history enthusiast or a software developer, understanding this function provides a deeper appreciation of ancient numeral systems and modern programming techniques.

Top comments (0)