2013-07-17 17 views
6

Próbuję dowiedzieć się, jak konwertować liczby rzymskie na liczby całkowite. To jest część mojego kodu. Kiedy pytam użytkownika, aby wprowadzić M, pokazuje 1000, ale kiedy pytam użytkownika, aby wprowadzić cyfrę rzymską, taką jak VM, to nie daje mi 995, ale zamiast tego 1005. To dlatego, że mówię mojemu programowi, żeby to zrobił.Próbuję dowiedzieć się, jak konwertować liczby rzymskie na liczby całkowite

Próbuję zrozumieć, w jaki sposób mogę patrzeć w przyszłość i dowiedzieć się, kiedy dodaje lub odejmuje cyfry rzymskie.

Jak zacząć to robić?

class Roman 
{ 

    public int inprogress = 0; 
    public Roman(string roman) 
    { 

     char temp = 'Z'; 
     int length; 

     length = roman.Length; 

     for (int i = 0; i < length; i++) 
     { 
      temp = roman[i]; 
      if (temp == 'M') 
      { 
       inprogress = inprogress + 1000; 
      } 
      if (temp == 'D') 
      { 
       inprogress = inprogress + 500; 
      } 
      if (temp == 'C') 
      { 
       inprogress = inprogress + 100; 
      } 
      if (temp == 'L') 
      { 
       inprogress = inprogress + 50; 
      } 
      if (temp == 'X') 
      { 
       inprogress = inprogress + 10; 
      } 
      if (temp == 'V') 
      { 
       inprogress = inprogress + 5; 
      } 
      if (temp == 'I') 
      { 
       inprogress = inprogress + 1; 
      } 
     } 
    } 
} 
+3

obiekt jest „konwersji do liczb całkowitych cyframi rzymskimi”, ale kod jest wyświetlany „do konwersji cyframi rzymskimi liczbami całkowitymi”. Którego właściwie pytasz? (Są przeciwieństwami.) Proszę [edytuj] swoje pytanie i wyjaśnij, o co prosisz. –

+0

Trochę porady: podczas programowania takiego rozwiązania będzie łatwiej, jeśli się zorientujesz JAK masz zamiar rozwiązać problem, TO skopiuj to rozwiązanie. Wyjmij kartkę papieru i spróbuj wymyślić sposób na prawidłowe obliczenie liczby rzymskiej dla niektórych próbek (używając tylko liczb i innych rzeczy, nie piszesz kodu na papierze!). Następnie zakoduj to rozwiązanie. –

+0

Czy możesz wyjaśnić, co się mówi przez "patrzeć w przyszłość", a być może zwrócę się o pomoc? Ps. Robisz coś niestosownego, jeśli sprawdzasz, użyj przełącznika/case lub zmień wszystkie instrukcje if, ale najpierw na "" else if ". –

Odpowiedz

11

trick do konwersji cyframi rzymskimi ma działać wstecz (od końca łańcucha) nie do przodu, sprawia, że ​​o wiele łatwiej.

przykład, jeśli masz IX

  • zacząć X = 10
  • ruch wstecz 1 .... Teraz ja, ja jest mniejsza niż X, tak teraz odjąć od 1 = 9

roztwór odniesienia ....

public class RomanNumeral 
    { 
     public static int ToInt(string s) 
     { 
       var last = 0; 
       return s.Reverse().Select(NumeralValue).Sum(v => 
       {      
       var r = (v >= last)? v : -v; 
       last = v; 
       return r; 
       }); 
     } 

     private static int NumeralValue(char c) 
     { 
      switch (c) 
      { 
       case 'I': return 1; 
       case 'V': return 5; 
       case 'X': return 10; 
       case 'L': return 50; 
       case 'C': return 100; 
       case 'D': return 500; 
       case 'M': return 1000;      
      } 
      return 0; 
     } 
    } 

UWAGA: to nie sprawdza cyframi rzymskimi, po prostu zamień te, które są już ważne.

+1

M to nie mniej niż X ..... więc możesz dodać M –

+0

OK, "czyni to o wiele łatwiejszym". Zgodzę się z tym. – user2246674

+0

również warto zauważyć, jest to klasyczne kody kodowania (wraz z grą w kręgle) http://codingdojo.org/cgi-bin/wiki.pl?KataRomanNumerals –

0

Musisz dodać logikę, która mówi, że jeśli V jest przed M, odejmij ją. Na podstawie tej linii:

jeśli (temp == "V") { inprogress = inprogress + 5;

1
List<Level> levels = new List<Level>(); 
    int[] val = new int[255]; 
    private void Form1_Load(object sender, EventArgs e) 
    { 

     val[(byte)'I'] = 1; 
     val[(byte)'V'] = 5; 
     val[(byte)'X'] = 10; 
     val[(byte)'L'] = 50; 
     val[(byte)'C'] = 100; 
     val[(byte)'D'] = 500; 
     val[(byte)'M'] = 1000; 
     levels.Clear(); 
     levels.Add(new Level('I', 'V', 'X')); 
     levels.Add(new Level('X', 'L', 'C')); 
     levels.Add(new Level('C', 'D', 'M')); 
    } 
    int fromRoman(string n) 
    { 
     n = n.ToUpper(); 

     var result = 0; 
     var lastDigit = 0; 
     for (var pos = n.Length - 1; pos >= 0; pos--) 
     { 
      var curDigit = val[(byte)n[pos]]; 


      if (curDigit >= lastDigit) 
       result += curDigit; 
      else 
       result -= curDigit; 

      lastDigit = curDigit; 
     } 

     return result; 
    } 
    public class Level 
    { 
     public Level(char i, char v, char x) 
     { 
      this.i = i; 
      this.x = x; 
      this.v = v; 
     } 
     public char i; 
     public char v; 
     public char x; 
    } 

następnie uruchomić

int Result = fromRoman("X"); 
+0

Dlaczego konwertujesz 'char's na' byte's? – Guillaume

+0

Ponieważ muszę podać numer indeksu do elementu w tablicy. – halit

Powiązane problemy