Addition, Subtraktion von "hochgenauen Integerzahlen"



  • moin alle zusammen,

    unser informatik prof hat uns eine aufgabe gegeben.
    wir sollen eun programm schreiben, wo man wörtlich: zwei zahlen (mit optionalem vorzeichen)im erlaubten wertebereich mit zwischengestellten verknüpfungszeichen(+,-), leerzeichen beliebig (auch innerhalb der ziffernfolge),
    eingabe als insgesammt drei zahlen, und zwar:

    -erste Zahl,
    -verknüpfungszeichen(+ oder -),
    -zweite zahl.

    ausgabe: rechenergebnis oder, wenn bereichüberschreitung, fehlermeldung.

    der Wertebereich soll +-(10^60-1) sein d.h. maximal 60 dezimalziffern.

    und jetzt kommt das problem :p im gesammten programm sind keine fließkommazahlen erlaubt. 😮

    und nun weiß ich nicht mehr weiter und steh auf dem schlauch.

    wäre echt schön, wenn mir jemand einen nützlichen tip geben könnte

    vielen dank

    elwood



  • Meinst du mit Fließkommazahlen Long Double?
    By the Way:
    Wie wäre es wenn du dir erst mal selbst
    Gedanken machst?

    MfG Jonas 🙂



  • long double darf ich nicht benutzen und sitze jetzt schon zwei tage vorm intet und dem compiler und mir fällt beim besten willen nichts ein.
    hab auch schon über ein array nachgedacht, weiß aber nicht genau wie ich das realisieren soll.(gibts nicht eine einfachere lösung?)



  • hast du vielleichtr schon irgendeinen ansatz?



  • die eigentliche fkt. ist ja kein problem, aber ich bekomm den wertebereich nicht hin



  • Darfst du irgendwelche Bibliotheken benutzen? Oder zumindest die Standardbibliothek?

    Ansonsten: Ein naiver Ansatz wäre, jeweils für einen gewissen Potenzbereich eine Variable anzulegen (oder als Teil eines Arrays). Besser wäre eine binäre Repräsentation, schau doch mal hier.



  • Du könnest einfach den größten Datentyp nehmen, den
    du nehmen darfst ich denke das dürfte long sein und
    dann zerhackst du deine Zahl in longs und rechnest
    damit und anschließend klebst du sie wieder zusammen
    (wenn ich Mist rede: einfach ignorieren :D)

    MfG Jonas 🙂



  • Speicher die Zahlen einfach als BCD - also ein char pro Ziffer. Addition und Subtraktion damit wirst Du ja wohl hinkriegen.



  • Belli schrieb:

    Speicher die Zahlen einfach als BCD - also ein char pro Ziffer. Addition und Subtraktion damit wirst Du ja wohl hinkriegen.

    und nem bool für das vorzeichen.... 😛


  • Administrator

    unskilled schrieb:

    und nem bool für das vorzeichen.... 😛

    Ist nicht mal nötig. Du kannst einer der char-Werte (meistens einer am Anfang oder Ender der Liste) dazu verwenden, dass Vorzeichen zu speichern. Ihn also positiv oder negativ zu machen. Hat seine Vor- und Nachteile.

    Neben BCD gibt es übrigens noch die Möglichkeit, dass du ein Integer Typ nimmst. Dann sagst du einfach, dass das Komma an der Stelle x ist. Addition und Subtraktion ist kein Problem, nur bei der Division und Multiplikation müsstest du aufpassen.
    Und was du natürlich machen muss, ist eine eigene Ein- und Ausgabe für diesen Datentyp. Aber besten erledigst du das alles über eine entsprechende Klasse.

    Grüssli



  • Dravere schrieb:

    Du kannst einer der char-Werte (meistens einer am Anfang oder Ender der Liste) dazu verwenden, dass Vorzeichen zu speichern. Ihn also positiv oder negativ zu machen. Hat seine Vor- und Nachteile.

    Ich finde, dass es eher Nachteile biete, als Vorteile 😛

    Neben BCD gibt es übrigens noch die Möglichkeit, dass du ein Integer Typ nimmst. Dann sagst du einfach, dass das Komma an der Stelle x ist...

    Ich weiß ja nicht, mit welchem Integer du 60 Stellen speichern kannst - mein Compiler kennt den leider nicht ;P

    bb



  • Für 9 Stellen braucht man 4 Oktetts, für 60 sind es dann 28. Wenn man beim BCD mit einem Oktett pro Dezimalstelle arbeitet, reduziert man also den Platzbedarf etwa auf die Hälfte. Außerdem kann man dann häufiger statt software- die Hardware-algorithmen für die Arithmetik einbinden (viele Platformen unterstützen keine BCD-Arithmetik in Hardware).



  • Man lerne die Zweierkomplementdarstellung, packe die ganzen Bits in einen String und schreibe eine Funkion die zwei dieser Strings addiert.

    Da es bei dir offensichtlich nicht auf Performance ankommt, kann man das ganze ruhig mit einem String basteln 😉 Wahlweise natürlich auch bool[] oder was-auch-immer 🙂



  • PS: man kann das natürlich auch mit Dezimalzahlen machen, aber bei Binärcodierung lernt man wenigstens gleich etwas über CPUs und wie sie funzen 😉


  • Administrator

    unskilled schrieb:

    Ich finde, dass es eher Nachteile biete, als Vorteile 😛

    Der Meinung bin ich eigentlich auch, habe aber nun schon von mehreren Leuten gehört, welche fanden, dass dies mehr Vorteile biete.
    Irgendwann will ich es auch noch ohne bool probieren, vielleicht haben sie ja recht und ich sehe es aktuell nur nicht ...

    unskilled schrieb:

    Ich weiß ja nicht, mit welchem Integer du 60 Stellen speichern kannst - mein Compiler kennt den leider nicht ;P

    Ups, habe das 60 übersehen 🙂
    Naja, dann müsste man wohl schon, wie talas geschrieben hat, vorgehen. Man teilt die Zahl auf mehrere Integer Zahlen auf. So lange man nur Addition und Subtraktion benötigt, dürfte dies keine grossen Problem verursachen. Man muss nur ein wenig mit std::numeric_limits herumhantieren, um die Over- und Underflows abzufangen.

    Grüssli


Anmelden zum Antworten