Ziffernanzahl einer Zahl bestimmen



  • Hi, sry wenn ich der x-te bin, der diese Frage stellt, aber ich möchte die Ziffernanzahl eines Integers bestimmen und darf die Zahl aber nicht verändern, weil ich die Zahl später noch ausgeben muss.
    Und keine Logorithmusfunktion bitte, eine Schleife wäre mir lieber.
    Danke im Voraus



  • Dann mache eine Kopie von der Zahl und teile sie so lange durch 10, bis sie 0 ist. Das zählst du mit.


  • Mod

    Oder alternativ vergleich die Zahl eben direkt mit 10, 100, 1000, ... Meinetwegen als Schleife, aber auch abgerollt ist das nicht lang. Diese Methode hat sich, wenn ich mich recht erinnere, hier im Forum als eine der schnellsten heraus gestellt (das heißt nicht, dass die anderen langsam wären). Kann die Zahl ein Vorzeichen haben? Falls ja, ist dies zu beachten.

    weil ich die Zahl später noch ausgeben muss.

    Willst du etwa die Ziffernzahl wissen, um Speicher für die Ausgabe zu reservieren? Nimm doch einen mitwachsenden Container. Oder schreib direkt in den Ausgabestream.



  • SeppJ schrieb:

    Diese Methode hat sich, wenn ich mich recht erinnere, hier im Forum als eine der schnellsten heraus gestellt (das heißt nicht, dass die anderen langsam wären).

    http://www.c-plusplus.net/forum/204619-full



  • Nathan schrieb:

    Dann mache eine Kopie von der Zahl.

    Was meinst du mit Kopie? 😕



  • C++Developer2000 schrieb:

    Nathan schrieb:

    Dann mache eine Kopie von der Zahl.

    Was meinst du mit Kopie? 😕

    Er meint wohl: Wenn du etwas verändern musst jedoch nicht verändern darfst, dann mach eine Kopie des Originals.



  • C++Developer2000 schrieb:

    Was meinst du mit Kopie? 😕

    const int unchangeable = 1234;
    int copyOfUnchangeable = unchangeable;
    
    copyOfUnchangeable = 42;
    


  • ich hatte vor einiger zeit, in i.einem forum, mal das gefunden...

    #include <cmath>
    
    int main()
    {
    	int zahlenwert = 0;
    	int zahlenwert2 = 123456789;
    
    	//ermittelt stellen der 1.zahl
    	int anzahl = zahlenwert ? static_cast<int>(log10(fabs(zahlenwert))) + 1 : 1;
    	std::cout << "0: " << anzahl << std::endl;
    
    	//ermittelt stellen der 2.zahl
    	int anzahl2 = zahlenwert2 ? static_cast<int>(log10(fabs(zahlenwert2))) + 1 : 1;
    	std::cout << "anzStellen2: " << anzahl2 << std::endl;
    
    }
    

    müsstest halt noch anpassen so das es das macht was du genau willst... 🙂



  • C++Developer2000 schrieb:

    ...
    Und keine Logorithmusfunktion bitte, eine Schleife wäre mir lieber.
    ...



  • sry für nachtrag:
    alternativ könntest du die zahlen in einen string wandeln und mit string funktion (size, strlen) dann die länge ermitteln...
    ist aber nicht so schön... außer du willst die zahl eh als string weiterverwenden 🙂

    hatte ich eben vergessen noch zu schreiben 🙂 ...
    lg



  • Belli schrieb:

    C++Developer2000 schrieb:

    ...
    Und keine Logorithmusfunktion bitte, eine Schleife wäre mir lieber.
    ...

    sry hatte ich überlesen *mein fehler* 😞

    für soetwas würde ich den aber eig generell benutzen dafür ist der da...
    dann arbeite dich lieber mal 1stunde da ein...
    du musst ja das mathematische vorgehen nicht 100 % verstehen nur benutzen sollst du es können 🙂 ...

    außerdem ist ja letztendlich nix anderes als schleifen... 🙄

    hoff ich konnte helfen 🙄
    lg



  • C++Developer2000 schrieb:

    und darf die Zahl aber nicht verändern, weil ich die Zahl später noch ausgeben muss

    Naja... ähm.
    Wie man Variablen kopiert weisst du schon, oder?
    Also...

    int zahl = ...; // Deine "originale" Zahl
    
        int zahl2 = zahl; // Die Kopie, die du jetzt verändern kannst
    

    Und davon abgesehen macht man sowas natürlich am elegantesten mit ner eigenen Hilfsfunktion

    int NumberOfDecimalPlaces(int n)
    {
        // Hier kann "n" beliebig modifiziert werden, da es ja auch ne Kopie ist
        return (irgendwas);
    }
    
    // ...
    
        int zahl = ...; // Deine "originale" Zahl
        int stellen = NumberOfDecimalPlaces(zahl);
    

Anmelden zum Antworten