Betrachten Sie diesen zusätzlichen Pseudo-Code und Hinweise (einige davon sind gültig für Python, andere nicht, aber es gibt Notizen).
%Vor%Sie müssen das Rad nicht neu erfinden (es sei denn, Sie möchten es). Python kommt mit einem Konverter:
%Vor%Wenn Sie es für Zahlen ab 5000 benötigen, müssen Sie eine neue Funktion schreiben und vielleicht Ihre eigene Schriftart erstellen, um die Zeilen über den römischen Ziffern darzustellen. (Es wird nur mit einigen Zahlen funktionieren. Stoppen bei 4999 ist eine wirklich gute Idee.)
Um in römische Ziffern zu konvertieren, verwenden Sie roman.toRoman(myInt)
.
Jemand anders hat tatsächlich mit demselben Quellcode verlinkt, den das römische Modul in einem der obigen Kommentare verwendet, aber ich glaube nicht, dass sie erwähnt haben, dass es tatsächlich mit Python kommt.
EDIT: Beachten Sie, dass Sie auf einigen Systemen (Windows, glaube ich) nicht einfach import roman
von der Standardinstallation eingeben können. Der Quellcode funktioniert jedoch immer noch unter Windows, und er ist mit dem Python 3.4.1-Quellcode-Download (wahrscheinlich auch früheren) an diesem Ort /Python-3.4.1/Doc/tools/roman.py
Okay, es gibt viele Dinge, die mit dem, was Sie gerade haben, nicht stimmen.
Erstens, der Grund dafür, dass Sie eine Menge Nullen erhalten, ist, dass Sie Ihre while string != "":
-Schleife nie verlassen und niemals ganze Zahlen zur Summe hinzufügen. So bleibt total
gleich Null und wird weiterhin gedruckt. Ich habe den von Ihnen geposteten Code kommentiert, damit Sie verstehen, was vor sich geht.
user2864740 hat einige gute Kommentare in ihrer veröffentlichten Lösung, schaut darüber, um einige der Dinge zu sehen, die ihr falsch gemacht habt.
Hier ist Python (2.7 leider) Code, der tut, was Ihr gegebener Pseudocode sagt.
%Vor% Bitte beachten Sie, dass der von Ihnen gepostete Pseudocode NICHT korrekt ist. Beachten Sie, was es für die Eingabe 'IIV'
tun wird. Es wird 1 von 1 subtrahiert und dann 5 addiert. Aber was es tun sollte, ist 2 von 5 zu subtrahieren.
Rechts-nach-links-Lösung, die etwas pythischer (keine Indizes) und relativ kurz ist.
Algorithmus:
Beispiel:
'xiv'
= & gt; sum(5, -1, 10)
= & gt; 14
Ausgabe:
%Vor% Hinweis: Es wäre schön, eine (kurze, inline) Methode zu finden, um die Zeichen der Sequenz im laufenden Betrieb zu ändern. Beispiel: (5, 1, 10)
== & gt; (5, -1, 10)
.
Update: Das ist so nah wie vor dem Aufgeben. Es ist identisch mit dem obigen Code, aber es verwendet itertools.tee()
mit zip()
, um Paare der vorherigen und aktuellen Werte zu generieren, um die Notwendigkeit für die Zustandsvariablen zu eliminieren. Der einzige Aufruf von next(cur)
macht diese Liste kürzer als prev
. Dies ist der gesamte Status, den wir benötigen, um herauszufinden, ob der aktuelle Wert hinzugefügt oder subtrahiert werden soll.
Beispiel:
%Vor%Code:
%Vor%Römische Zahlen werden von links nach rechts gelesen, wenn Sie den Wert jedes Symbols addieren oder subtrahieren.
Wenn ein Wert niedriger als der folgende Wert ist, wird er subtrahiert. Sonst wird es hinzugefügt.
Zum Beispiel wollen wir die römische Zahl MCMLIV zu einer arabischen Zahl umwandeln:
%Vor%Wir können jetzt die Zahl berechnen:
%Vor%ref: Ссылка
%Vor%Es gibt eine sehr detaillierte Beschreibung der Entwicklung der römischen Zahlenumrechner im Dive Into Python 3 von Mark Pilgrim . Weitere Informationen finden Sie in der 5.3. Fallstudie: Römische Ziffern , die das Problem und die Details einführt.
Aber das ist nicht alles. Siehe die Kapitel 9. Komponententests , wo die Analyse und Implementierung von Umrechnern mit römischen Zahlen fortgesetzt wird, einschließlich interessanter Optimierungen und Ausnahmen Werfen - die (unit) testgetriebene Entwicklung.
Es steht in direktem Zusammenhang mit dem Verweis des Enginefree auf den Code im ersten Kommentar unterhalb der Frage (der Code wurde von Mark Pilgrim geschrieben).
Hier ist etwas, das ich mit Wörterbuch erfunden habe. Es sollte v.einfach sein. Sag mir was du denkst. Ich muss sagen, dass es nicht mit den römischen Zahlen funktioniert, die in Form von MIM geschrieben wurden (anstelle von MCMXCIX für 1999). Dies gilt nur für gültige römische Ziffern.
%Vor%Arbeiten Sie von rechts nach links der römischen Zahl, um Werte hinzuzufügen oder zu subtrahieren. Einfach.
%Vor%versuche das:
%Vor%Das Lambda steht für eine einzeilige Funktion. Deshalb werden sie anonyme Funktionen genannt. Sie müssen sie nicht mit def und all dieser Formalität definieren.
Sie können so etwas in die Shell eingeben:
f = Lambda x: x + 3 f (3) 6 oder f = Lambda x, y: x + y f ("foo", "bar") 'Foobar'
Ich verwende map , um meine newborn-Funktion auf jedes Element eines iterablen Elements anzuwenden. In diesem Fall ist das iterable eine Zeichenfolge wie "mclvii". Dadurch habe ich eine Liste erstellt, in der jeder Wert seinen jeweiligen Wert darstellt. Sehen Sie sich ein Lambda-Beispiel an, um Quadrate zu berechnen:
%Vor%Also, es ist Lambda, wenn Sie eine Funktion im laufenden Betrieb benötigen, und eine Zuordnung, wenn Sie eine Funktion auf alle Elemente in einer Liste anwenden möchten.
Nun ein Beispiel mit Rekursion:
%Vor%Tags und Links python python-3.x