« Welche App braucht man? | Main| Römische Zahlen (2) »

Römische Zahlen (1)

0
Kategorie    
Die meisten Implementierungen um eine arabische Zahl in eine römische zu konvertieren sehen (mehr oder weniger) wie folgt aus:

    static uint[] nums = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
   static string[] rum = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
 
   static string ToRoman(uint number)
   {
       string value = "";
       for (int i = 0; i < nums.Length && number != 0; i++)
       {
           while (number >= nums[i])
           {
               number -= nums[i];
               value += rum[i];
           }
       }
       return value;
   }

Was mich bei dieser Implementierung stört sind die beiden Arrays, weil man ja eigentlich nur eines bräuchte ...
Also versuchte ich, diese Redundanz zu entfernen, das Ergebnis hat zwar keine Redundanz (von Informationen), aber wirklich lesbar ist es nicht
      public static char[] letters = { 'M', 'D', 'C', 'L', 'X', 'V', 'I' };

      public static string ToRoman(int arabic) {
         if (arabic < 1) return string.Empty;
         if (arabic > 3999) return "N";        
         string roman = string.Empty;
         int N = arabic;
         for (int i = 0; i < letters.Length; i++) {
            for (int j = 0; j <= 1; j++) {
               int n = (int)Math.Pow(10, (letters.Length - 1 - i) / 2) * ((i % 2 == 1) ? 5 : 1);
               string l = string.Empty;
               if (i < letters.Length - 1) {
                  int k = (j == 0) ? 0 : (i % 2 == 1 ? 1 : 2);
                  switch (k) {
                     case 0:
                        l += letters[i];
                        break;
                     case 1:
                        n -= n / 5;
                        l += letters[i + 1] + letters[i];
                        break;
                     case 2:
                        n -= n / 10;
                        l += letters[i + 2] + letters[i];
                        break;
                     default:
                        l = string.Empty;
                        n = 0;
                        break;
                  }
               } else {
                  l += letters[i];
               }
               while (N >= n) {
                  roman += l;
                  N -= n;
               }
            }
         }
         return roman;
      }

Da das Ergebnis nicht richtig befriedigend ist, galt es eine andere Lösung zu finden.

Gruß JJR
P.S.: Mehr heute nachmittag Römische Zahlen (2)

Mach einen Kommentar

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Amazon


Impressum

Firmenname: Peanuts-Soft
Straße Nummer: Biinger Strasse 8
PLZ Ort: 55263 Wackernheim
Telefon: +491772134526
E-Mail: joerg.reck @ peanuts-soft.de
Disclaimer: Peanuts-Soft übernimmt keine Garantie dafür, dass die auf dieser Website bereitgestellten Informationen vollständig, richtig und stets aktuell sind. Dies gilt auch für alle Links, auf die verwiesen wird. Peanuts-Soft ist für die Inhalte, auf die per Link verwiesen wird, nicht verantwortlich. Peanuts-Soft haftet nicht für konkrete, mittelbare und unmittelbare Schäden oder Schäden, die durch fehlende Nutzungsmöglichkeiten, Datenverluste oder entgangene Gewinne – sei es aufgrund der Nichteinhaltung vertraglicher Verpflichtungen, durch Fahrlässigkeit oder eine andere unerlaubte Handlung – im Zusammenhang mit der Nutzung von Dokumenten oder Informationen bzw. der Erbringung von Dienstleistungen entstehen, die auf dieser Web Site zugänglich sind.
Datenschutz: Inhalt und Gestaltung der Internetseiten sind urheberrechtlich geschützt. Eine Vervielfältigung der Seiten oder deren Inhalte bedarf der vorherigen schriftlichen Zustimmung von Peanuts-Soft.


Locations of visitors to this page

Powered By

Domino BlogSphere
Version 3.0.2