Eine zahl größer als 4294967295 (unsigned int) Speichern?



  • Hi,
    Wie wärs denn die Kundennummer als String zu speichern? Dann kannst du die Länge der Zahl frei wählen und kannst auch sehr einfach auf die einzelnen Stellen der Nummer zugreifen.

    Tschau,

    Cappo



  • siehe mein post über dir...



  • Also jetzt hatte ich noch diese idee:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string KundN;
    
    int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, P;
    
    int main()
    {
    	cout << "Bitte Kundennummer eingeben:";
    	cin >> KundN;			// <-- 'KundN' (10 Ziffern)
    
    /*------------- Zerlegunge in einzelne Ziffern -----------*/
    
    		x1 = KundN[0] - 48; // Ansicode des Zeichens (Zahl), an stelle [0] - 48
    		x2 = KundN[1] - 48;
    		x3 = KundN[2] - 48;
    		x4 = KundN[3] - 48;
    		x5 = KundN[4] - 48;
    		x6 = KundN[5] - 48;
    		x7 = KundN[6] - 48;
    		x8 = KundN[7] - 48;
    		x9 = KundN[8] - 48;
    		x10 = KundN[9] - 48;
    
    /*--------------------- Prüfung --------------------------*/
    
    	P = (x1 + x10 + x5) * x2;
    
    /*--------------------- Antwort --------------------------*/
    	if ( P = 1000 )
    	{
    		cout << "Kundennummer Richtig";
    	}
    	else ()
    	{
    		cout << "Kundennummer Falsch";
    	}
    	return 0;
    }
    

    So... in diesem Code wird praktisch das erste Zeichen eingelesen. Da es nur Zahlen sind, habe ich praktisch bei der '0' das Ansicode Zeichen '48'. Bei '1' die '49' bei '2' die '50' usw... bei '9' die '57'. Also ziehe ich von dem eingegebenen Zeichen '48' ab, um auf die "Wirkliche" zahl zu kommen.

    Die Sache hat nur einen hacken. Wen das Programm, wen auch sehr unwahrscheinlich, in China/Anfganistan/Russland/... Ausgeführt werden würde, dann hätte das Zahlensystem auch andere Ansicode.
    Also ist das wohl ehr eine Schlechte Lösung.

    Em, könntet ihr, die auch schon Vorschläge gemacht haben nicht gerade den Beispiel Code zu einem Beispiel um Editieren? Ich kann mir die Umsetzung nur schlecht vorstellen... Wäre nett.



  • x1 = atoi(KundN[0]);
    

    Funktioniert glaub ich auch in china.

    Aber elegant ist das auch nicht.

    Du kannst ja auch mal unsigned __int64 anstatt int ausprobieren. Der kann wesentlich weiter zählen als int.

    mfg.



  • x1 = atoi(KundN[0]);
    

    Habe probiert... allerdings hat das noch nicht einmal auf anhieb funktioniert...

    char tmp;
    
    tmp = KundN[0];
      x1 = atoi(&tmp);
    

    Musste man so lösen, da nämlich wegen const char irgendetwas nicht funktioniert hat. Ist ja "auch" eine C Funktion...

    Hier der Link: http://www.cplusplus.com/ref/cstdlib/atoi.html

    unsigned __int64 geht dann bis 8589934590. Also könnte ich keine höhere anfangs Ziffer als 8 eingeben. 9XXXXXXXXX wäre dann immer noch nicht möglich... Abgesehen davon... geht das überhaupt auf einem 32 Windows XP?

    ... tja... wäre für weitere ideen offen...



  • Allerdings würde ich die Zahlen anschließend in einem Vektor speichern und nicht in 10 Variablen:

    vector<int> numbers;
    size_t len=KundN.length();
    for(int i=0; i<len; ++i) {
      char tmp=Kund[i];
      numbers.push_back(atoi(&tmp));
    }
    

    Das hier

    x1 = atoi(KundN[0]);
    

    geht nicht, weil da ein const char und kein const char* bei rauskommt. Und ein & vor KundN[0], also "&KundN[0]" geht nicht, weil dann wieder der gesamte String beachtet wird, daher musst du eine temporäre Variable verwenden und von der die Adresse übergeben.

    Zu deiner Frage mit dem uint64, ja das geht auf einem 32-Bit Windows, aber wieso nimmste nicht einfach wie gesagt einen String? Damit ist das doch viel handlicher. Wenn du auch noch rechnen willst oder so mit dieser großen Zahl, dann guck dich mal im Forum um, da gab es schon öfter Themen zu beliebig großen Zahlen.



  • logorithmen



  • Dino Crisis schrieb:

    x1 = atoi(KundN[0]);
    

    Habe probiert... allerdings hat das noch nicht einmal auf anhieb funktioniert...

    char tmp;
    
    tmp = KundN[0];
      x1 = atoi(&tmp);
    

    Ja das geht aber auch so:

    #include <iostream>
    
    int main() {
        std::string KundN("123");
        int x1 = atoi(&KundN[0]);
        std::cout << x1 << std::endl;
        return 0;
    }
    

    Musste man so lösen, da nämlich wegen const char irgendetwas nicht funktioniert hat. Ist ja "auch" eine C Funktion...

    Ne, das hat mit C Funktion nichts zu tun, sondern es fehlte einfach der & Operator in dem Beispiel.

    unsigned __int64 geht dann bis 8589934590.

    Nein, viel mehr. Schau:

    #include <iostream>
    
    int main() {
        std::cout << "unsigned int: " << std::numeric_limits<unsigned int>::max() << std::endl;
        std::cout << "unsigned __int64: " << std::numeric_limits<unsigned __int64>::max() << std::endl;
        return 0;
    }
    

    Ausgabe:

    unsigned int: 4294967295
    unsigned __int64: 18446744073709551615
    

    mfg



  • Dino Crisis schrieb:

    und zwar will ich eine 10 Ställige Zahl bearbeiten.

    HILFE!!!
    Wieviel Pferde passen denn so in eine Zahl 😮

    Und allgemein die Frage wieso du unbedingt deine Kundennummer in eine
    Zahl verwandeln willst. Belaß sie doch einfach als String. Nur
    bei der Prüfung auf Gültigkeit würde ich die notwendigen Stellen des
    Strings als Zahl auffassen.



  • Oh man junge... wider ein Spaten spam... Lese mal meine Sig du asi!

    Ich habe gesagt das es nur ein beispiel ist. Es müssen alle Ziffern verfügbar sein.
    --- Diese Unregistrierter User gehen mir echt auf den Sack ---
    -------------------------------------------------------------------

    Also die idee mit den unsigned int64 finde ich eigentlich nicht schlecht. Aber ich kann mir die umsätzung als String wirklich nur schwer vorstellen. Bosonders da es bei mir wirklich nicht funktioniert hat. (oder Falsch geemacht habe)

    Könnte mir da nicht jemand ein Beispiel geben?

    Ich "programiere" auch erst seit kurzer zeit...

    Gruß und Danke,
    Dino



  • Dino Crisis schrieb:

    ...umsätzung...Bosonders...geemacht...programiere

    Könnte es sein, daß dein eigentliches Problem tiefer liegt?

    - pisanische Rechtschreibung?
    - Konzentrationsschwierigkeiten?

    und deiner Signatur kann ich auch nur entnehmen, daß du Schüler bist;
    was auch nicht alles verzeiht (es sei denn du bist erst 11).

    Egal, zurück zum Thema...



  • Jdeer slltoe so shciebren wies ihm gfället 🙂



  • @joomoo:

    std::string KundN("123");
    int x1 = atoi(&KundN[0]);
    

    Genau das habe ich beschrieben. Wenn KundN ein String ist geht das nicht. Dann wird nicht nämliche die Adresse des ersten Zeichens übergeben und atoi läuft bis zum Ende des Strings durch und wandelt dadurch den gesamten String und nicht nur das erste Zeichen um (habe es auch zusätzlich nochmal getestet).
    In diesem Beispiel hätte x1 den Wert 123.



  • Dino Crisis schrieb:

    Also die idee mit den unsigned int64 finde ich eigentlich nicht schlecht. Aber ich kann mir die umsätzung als String wirklich nur schwer vorstellen. Bosonders da es bei mir wirklich nicht funktioniert hat. (oder Falsch geemacht habe)

    Mit Strings ist das so: Du kannst damit nicht wirklich rechnen, aber das willst du bei den KundenNr ja eigentlich auch nicht. Du kannst Strings nähmlich vergleichen. Beispiel:

    #include <string>
    #include <iostream>
    
    int main() {
        std::string KundenNr1("5615234546841");
        std::string KundenNr2("8916512354645");
        std::string KundenNr3("5615234546841");
    
        std::cout << "KundenNr1 == KundenNr2 " << (KundenNr1 == KundenNr2) << std::endl;
        std::cout << "KundenNr1 == KundenNr3 " << (KundenNr1 == KundenNr3) << std::endl;
        std::cout << "KundenNr2 == KundenNr3 " << (KundenNr2 == KundenNr3) << std::endl;
        return 0;
    }
    

    mfg.



  • Hi Vellas,

    Vellas schrieb:

    ... mit dieser großen Zahl, dann guck dich mal im Forum um, da gab es schon öfter Themen zu beliebig großen Zahlen.

    hast du da evtl ein paar passende Schlagworte für die Suche, mit Zahlen oder groe Zahlen habe ich noch keine zufriedenstellenden Ergebnisse erreicht.
    Mich beschäftigt zur Zeit nämlich auch noch ein Problem mit zu großen Zahlen.



  • Hallo

    auch wenns nun mittlerweile ehe OT ist, GMP ist ein Stichwort.

    bis bald
    akari


Anmelden zum Antworten