Wie speichern Sie einen beliebig großen Ganzzahlwert im Speicher?

7

Ich muss einen ganzzahligen Wert speichern, der größer als der maximale Wert für den langen Datentyp ist. Wie würde ich diesen Wert im Speicher speichern und bearbeiten?

Bitte erläutern Sie es, wenn möglich, anhand eines Beispiels.

    
yatin 12.02.2010, 15:35
quelle

7 Antworten

19

Denken Sie darüber nach, Zahlen mit einer Struktur wie dieser als Folgen von Dezimalziffern zu speichern:

%Vor%

Zum Beispiel könnte die Zahl 123456 als

initialisiert werden %Vor%

Die Reihenfolge der umgekehrten Ziffern ist wichtig für die einfache Berechnung. Insbesondere ist der Stellenwert von n.d[i] n.d[i] * 10 ^ i.

Nun, ein paar Fragen:

  • Wie würdest du eins zu einem num hinzufügen?
  • Wie würden Sie einer num ?
  • eine beliebige einzelne Ziffer hinzufügen?
  • Wie würden Sie zwei num s zusammenfügen?
  • Wie würden Sie num mit zwei multiplizieren?
  • Wie würden Sie num mit einer einzelnen Ziffer multiplizieren?
  • Wie würden Sie ein num mit 10 multiplizieren?
  • Wie würdest du zwei num s zusammen multiplizieren? TIPP: Machen Sie einige Bleistift- und Papier-Multiplikationen und sehen Sie, wie sie funktionieren.

Wenn Sie diese Abfolge von Fragen durcharbeiten, sollten Sie in der Lage sein, für jeden Schritt eine Funktion zu schreiben und diese Funktionen für die Beantwortung der späteren Fragen wiederzuverwenden. Dies führt zu einem sehr einfachen und nicht optimierten langen (gut, up to MAXDIGIT digits) Integer-Paket für Addition und Multiplikation von positiven Zahlen.

Andere Fragen:

  • Wie verallgemeinern Sie num , um sowohl negative als auch positive Zahlen darzustellen?
  • Wie teilst du ein num durch ein anderes (ignoriere Reste)? Das ist kniffliger als die Multiplikation, aber beginnen Sie wieder mit ein paar Bleistift- und Papier-Divisionen und überlegen Sie genau, was Sie tun.
Dale Hagglund 13.02.2010 05:06
quelle
7

Mögliche Lösungen:
1) Definieren Sie einen benutzerdefinierten Integer-Typ, der groß genug ist, um diesen Wert zu speichern. 128-Bit-Integer ist groß genug, um 9847473747574747374739399 zu halten.
2) Verwenden Sie eine beliebige bignum Bibliothek.

    
SigTerm 12.02.2010 15:49
quelle
3

Ich werde Ihnen den Code nicht geben, aber ich kann ein paar Vorschläge für Ansätze machen:

  1. Versuchen Sie, den Wert als Zeichenkette zu speichern und zur Durchführung von Berechnungen zu konvertieren
  2. Versuchen Sie, den Wert in mehrere ganze Zahlen aufzuteilen, die einen Teil des Werts
  3. darstellen
  4. Sieh dir vorhandene Bibliotheken an, die dies für dich erledigen können

Viel Glück

    
Amish Programmer 12.02.2010 15:40
quelle
3

Robert Lafore - Objektorientierte Programmierung in C ++, 4. Ausgabe:

%Vor%

Verylong-Klassenheader

%Vor%     
dr.b 11.05.2012 20:28
quelle
2

Dies ist eine häufige Frage im einführenden Informatikunterricht an der Universität. Die primären Bereiche des Fokus sind a) zu verstehen, wie (ganzzahlige) Zahlen als Binärziffern gespeichert werden, und b) die Grundlagen von Datenstrukturen, wobei, wenn eine Programmiersprache nicht die gewünschte Datenstruktur selbst bereitstellt, Sie meta verwenden können oder Auflistungsstrukturen, z. B. struct in C, class in C ++ oder record in Pascal.

Wie wird eine kleinere ganze Zahl in einem Computer gespeichert? In C haben Sie Datentypen char, short, int, long , die alle zum Speichern von Ganzzahlen verschiedener Größen verwendet werden können. (Ich werde long long für diese Diskussion ignorieren.) Sagen wir aus Gründen der Allgemeinheit, dass auf einer gegebenen 32-Bit-Plattform die Größen 8-Bit, 16-Bit, 32-Bit bzw. 64-Bit sind. Berücksichtigen Sie die Werte, die dargestellt werden können (vereinfacht als unsigniert).

Nun, wie könnten Sie eine größere Ganzzahl speichern, die nicht in einem 64-Bit-Zeichen ohne Vorzeichen gespeichert werden kann? Erstellen Sie Ihren eigenen großen Integer-Datentyp, der aus mehreren kleineren (aber normalen) Ganzzahlen besteht, sodass sie größere Werte darstellen.

Ich denke, das sollte dich in die richtige Richtung weisen und dir ermöglichen, deine eigene Antwort auf deine Hausaufgaben oder Prüfungsfragen zu schreiben.

    
mctylr 13.02.2010 03:54
quelle
0
%Vor%     
Holger Kretzschmar 16.02.2010 13:50
quelle
-1

Wenn es nur für die Anzeige ist, würde ich eine <stdio.h> (für den berüchtigten printf) aus der c-Standardbibliothek oder vielleicht die <string.h> vorschlagen, um etwas zu ändern.

    
call me Steve 13.02.2010 05:19
quelle