konwersja liczb

0

Witam, mam problem z programem konwertującym liczby rzymskie na arabskie i odwrotnie. Konkretnie, to gdy wpiszę liczbę arabską to działa dobrze, lecz jeśli rzymską to wyskakuje mi nieprawidłowa dana. Wiem, że problem może być spowodowany ****rzym!=arab2rzym(parametr) ****, ale nie wiem dlaczego przez to. Jeśli usunę ten wyjątek to większość przypadków działa, no ale nie wszystkie. Byłby ktoś w stanie pomóc z tym?


public class RzymArab
{
	
	private static String[] rzymskie = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
	private static int[] arabskie = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};

	private static boolean isInt(String line)
   	{
      		boolean isInt=true;
      		try
      		{
         		Integer.parseInt(line);
      		}
      		catch(NumberFormatException ex)
      		{
         		isInt=false;
      		}
   		return isInt;
   	} 


	public static int rzym2arab (String rzym) throws RzymArabException
	{
		
		int parametr=0;
		int tmp=0;

		for(int i=0; i<rzymskie.length; i++)
		{
			while(rzym.startsWith(rzymskie[i], tmp))
			{
				parametr=parametr+arabskie[i];
				tmp=tmp+rzymskie[i].length();
			}
		}

		if( rzym!=arab2rzym(parametr) || parametr>3999 )
			throw new RzymArabException("Nieprawidłowa dana");
		
	
		return parametr; 	
	}
	
	
	public static String arab2rzym (int arab) throws RzymArabException
	{
		
		if(arab<1 || arab>3999)
			throw new RzymArabException("Nieprawidłowa dana");

			
		StringBuilder parametr = new StringBuilder("");
		for(int i=0; i<arabskie.length; ++i)
		{
			while(arab>=arabskie[i])
			{
				parametr.append(rzymskie[i]);
				arab=arab-arabskie[i];
			}
		}	

		return parametr.toString();
	}

	public static void main(String[] args)
	{
		for(String t: args)
		{
			try 
			{
				if(isInt(t))
				{
					int n=Integer.parseInt(t);
					System.out.println(arab2rzym(n));
				}
				else
				{
					System.out.println(rzym2arab(t));	
				}
			}
			catch(RzymArabException e)
			{
				System.out.println(e.getMessage());
				continue;
			}
		}
	}
	
}

class RzymArabException extends Exception 
{
	public RzymArabException(String message)
	{
		super(message);
	}
}


1

W języku Java napisy porównuje się za pomocą metody equals.

1

Nie Uwzględniasz wszystkiego, sugeruję rozdzielić input string z rzymska cyfrą do listy cyfr, które mozna zsumować, zgodnie z zasadami:

  • Pojedynczą (jedna cyfra - jedna liczba, jak I, M), cyfrę, powtórzona do trzech razy, można zsumować, II = 2, XXX = 30, ale XXXX != 40, XL = 40;
  • mniejsza cyfra z lewej strony wiekszej, powoduje, że całość to dwuznakowa liczba równa większej odjętej od mniejszej(w tym przypadku mniejsza musi być co najmniej 10 razy mniejsza);
  • jesli mniejsza cyfra jest z lewej strony wiekszej to je dodajemy, np.: XI - 11, etc.;
  • cyfry czyta sie od lewj do prawej i nie mogą rosnąć, czyli mamy XVII, ale nie IIIX;
  • V, L i D mogą wystąpic tylko raz na liczbę.
0

Super,dziękuję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1