Ваш алгоритм был довольно близок, во-первых, для нуля нет римской цифры; так что проверьте, что num
(или value
) хотя бы один. Во-вторых, я переименовал num
в value
, потому что nums
затрудняет дифференциацию. Далее для циклов требуется условие завершения boolean
. Здесь вы хотите завершить внешний l oop, когда i
меньше нуля, и внутренний l oop, когда j
больше (или равен) value / nums[i]
. Наконец, поскольку вы не используете состояние экземпляра, я создал метод static
. Например,
public static String intToRoman(int value) {
if (value < 1 || value > 3999) {
return "-1";
}
int nums[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 };
String[] syms = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD",
"D", "CM", "M" };
StringBuilder sb = new StringBuilder();
for (int i = nums.length - 1; i >= 0; i--) {
if (value >= nums[i]) {
for (int j = 0; j < (value / nums[i]); j++) {
sb.append(syms[i]);
}
value %= nums[i];
}
}
return sb.toString();
}
Что я проверял, например
public static void main(String[] args) {
for (int i = 1; i < 100; i++) {
System.out.println(intToRoman(i));
}
}
И здесь, похоже, он работает правильно.