Drill

ProblemsJava › warmup

Write a number in Roman numerals

mediumwarmupMathStringsGreedyJava

A film credit or a chapter heading wants MCMXCIV rather than 1994.

toRoman(amount: int) → string

Java needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.

Solve it in Python →

Where you start

String toRoman(int amount) {
    
}

Worked examples

CallResult
toRoman(1)"I"
toRoman(4)"IV"
toRoman(14)"XIV"
toRoman(1994)"MCMXCIV"

Hint

Keep the values and their symbols in one descending table, including the subtractive pairs. Then it is one greedy pass.

Reference solution in Java
String toRoman(int amount) {
    if (amount < 1 || amount > 3999) return "";
    int[] vals = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] syms = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    int n = amount;
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < vals.length; i++) {
        while (n >= vals[i]) { sb.append(syms[i]); n -= vals[i]; }
    }
    return sb.toString();
}

The same problem in another language

More warmup problems in Java