Перевод арабских цифр в римские
Имеется задача конвертировать арабские цифры в римские. Хотел сделать через методы, но в итоге арабским цифрам присваиваются некорректные значения римских.
Пример:
Ввод : 10
Вывод :XC
Не могу понять, откуда подтягивается C, если количество соток = 0.
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int units = x%10;
int tens = (x%100)/10;
int hundreds = (x%1000)/100;
System.out.println(Hundreds(hundreds) + Tens(tens) + Units(units));
}
public static String Units(int units) {
String s_units="";
switch (units) {
case 1: s_units = "I";
case 2: s_units = "II";
case 3: s_units = "III";
case 4: s_units = "IV";
case 5: s_units = "V";
case 6: s_units = "VI";
case 7: s_units = "VII";
case 8: s_units = "VIII";
case 9: s_units = "IX";
}
return s_units;
}
public static String Tens(int tens) {
String s_tens="";
switch (tens) {
case 1: s_tens = "X";
case 2: s_tens = "XX";
case 3: s_tens = "XXX";
case 4: s_tens = "XL";
case 5: s_tens = "L";
case 6: s_tens = "LX";
case 7: s_tens = "LXX";
case 8: s_tens = "LXXX";
case 9: s_tens = "XC";
}
return s_tens;
}
public static String Hundreds(int hundreds) {
String s_hundreds="";
switch (hundreds) {
case 1: s_hundreds = "C";
}
return s_hundreds;
}
}
Ответы (2 шт):
Автор решения: tym32167
→ Ссылка
Чето как то у вас всё сложно больно. Я бы попробовал по другому решить. Я бы просто отнимал из числа римские значения, пока число в 0 не превратилось.
Ну вот пример на C#, но на java там почти тож самое будет
public string IntToRoman(int num)
{
var keys = new string[] { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
var vals = new int[] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
StringBuilder ret = new StringBuilder();
int ind = 0;
while(ind < keys.Length)
{
while(num >= vals[ind])
{
var d = num / vals[ind];
num = num % vals[ind];
for(int i=0; i<d; i++)
ret.Append(keys[ind]);
}
ind++;
}
return ret.ToString();
}
Проверка
Console.WriteLine(IntToRoman(28));
Console.WriteLine(IntToRoman(128));
Console.WriteLine(IntToRoman(628));
Console.WriteLine(IntToRoman(1628));
Вывод
XXVIII
CXXVIII
DCXXVIII
MDCXXVIII
Автор решения: tym32167
→ Ссылка
Вы в своих case забыли break вставить, потому у вас выбирается последнее выражение
case 9: s_tens = "XC";
на любое число в диапазоне 1-9
я бы в вашем коде заменил все
case 1: s_tens = "X";
на
case 1: return "X";