0

Имеется задача конвертировать арабские цифры в римские. Хотел сделать через методы, но в итоге арабским цифрам присваиваются некорректные значения римских.

Пример:

Ввод : 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 Answers2

2

Вы в своих case забыли break вставить, потому у вас выбирается последнее выражение

case 9: s_tens = "XC";

на любое число в диапазоне 1-9

я бы в вашем коде заменил все

case 1: s_tens = "X";

на

case 1: return "X";

tym32167
  • 32,857
1

Чето как то у вас всё сложно больно. Я бы попробовал по другому решить. Я бы просто отнимал из числа римские значения, пока число в 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
  • 32,857