← StartseiteProgrammierung (Програмування)

Aufgabe: Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby)

Erfahren Sie, wie Sie mit Ruby eine römische Zahl in eine Dezimalzahl umwandeln. Eine einfache und effektive Lösung des Problems mit einer Erklärung des Funktionsprinzips des Algorithmus und Tests mit RSpec. Geeignet ...

InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Betrachten wir eine einfache Möglichkeit, das Problem der Umwandlung einer römischen Zahl in eine Dezimalzahl (Ruby) zu lösen.

Aufgabe

Erstellen Sie eine Funktion solution, die einen String — eine römische Zahl — akzeptiert und ihren Wert als dezahlen Ganzzahl zurückgibt.
Eine Validierung der Richtigkeit der römischen Schreibweise ist nicht erforderlich.
Beispiele:
  • "MCMXC" → 1990
  • "MMVIII" → 2008
  • "MDCLXVI" → 1666

Wie funktioniert die Umwandlung von römischen Zahlen in Dezimalzahlen?

Römische Zahlen sind ein Zahlensystem, das auf Symbolen basiert, von denen jedes einem bestimmten Wert entspricht: I — 1, V — 5, X — 10, L — 50, C — 100, D — 500, M — 1000. Um eine Zahl zu schreiben, werden die Symbole nach bestimmten Regeln kombiniert. Wenn ein Symbol mit einem geringeren Wert vor einem größeren steht (zum Beispiel IV), bedeutet das Subtraktion (5 - 1 = 4). Stehen sie jedoch in umgekehrter Reihenfolge — werden sie addiert (VI = 5 + 1 = 6). Dank dieser Logik können sowohl einfache als auch komplexe Zahlen kompakt geschrieben werden, wie MCMXC für 1990.
Bei der Umwandlung von römischen Zahlen in Dezimalzahlen durchläuft der Computeralgorithmus die Zeichen des Strings von rechts nach links. Dies ermöglicht es, leicht zu bestimmen, ob der Wert des Symbols addiert oder subtrahiert werden muss. Zum Beispiel beginnt die Verarbeitung in XIV mit V = 5, dann I = 1 (weniger als V, daher subtrahieren: 5 - 1 = 4), dann X = 10 (mehr als I, daher addieren: 10 + 4 = 14). Dieser Ansatz ermöglicht eine effiziente Implementierung der Umwandlung selbst in wenigen Codezeilen.

Test (rspec) zur Überprüfung der Methode

RSpec.describe '#solution' do
  it 'wandelt einfache römische Zahlen um' do
    expect(solution('I')).to eq(1)
    expect(solution('III')).to eq(3)
    expect(solution('VIII')).to eq(8)
  end

  it 'wandelt zusammengesetzte römische Zahlen um' do
    expect(solution('IV')).to eq(4)
    expect(solution('IX')).to eq(9)
    expect(solution('XL')).to eq(40)
    expect(solution('XC')).to eq(90)
  end

  it 'wandelt große römische Zahlen um' do
    expect(solution('MCMXC')).to eq(1990)
    expect(solution('MMVIII')).to eq(2008)
    expect(solution('MDCLXVI')).to eq(1666)
    expect(solution('MMMCMXCIX')).to eq(3999)
  end
end

Methode solution

Eine der Möglichkeiten zur Lösung (mit Ruby können die gleichen Dinge auf viele Arten gemacht werden).
def solution(roman)
  values = {
    'M' => 1000,
    'D' => 500,
    'C' => 100,
    'L' => 50,
    'X' => 10,
    'V' => 5,
    'I' => 1
  }

  total = 0
  prev = 0

  roman.chars.reverse.each do |char|
    current = values[char]
    if current < prev
      total -= current
    else
      total += current
      prev = current
    end
  end

  total
end

Funktionsweise des Algorithmus

Wir bewegen uns vom Ende des Strings und addieren die Werte der Symbole. Wenn die aktuelle Zahl kleiner als die vorherige ist — subtrahieren wir sie, andernfalls — addieren wir sie. Dies ermöglicht eine korrekte Verarbeitung von Fällen wie IV oder CM.

🔥 Weitere Beiträge

Alle Beiträge