Zählen wie oft Zahl a in Zahl n vorkommt



  • Hallo. Ich bitte um Hilfe. Ich versuche meinem Sohn bei den Hausaufgaben zu helfen. Ich hatte früher C++ in der Schule gehabt, jedoch seitdem nichts mehr damit zu tun gehabt.
    Die Hausaufgabe lautet eine Funktion zu schreiben, die zählt wie oft eine Zahl a in der Zahl vorkommt. Also Bsp.: Zahl a=52233 Zahl n=2
    n kommt 2mal vor.
    Ich versuche mich langsam in die Sache reinzusteigern, jedoch hängt es bei mir gerade hier:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string eingabe = "1233";
        int zahl = 3;
        int ausgabe = 0;
        for (int i = 0; i <= eingabe.length(); i++) {
            if (eingabe.length()==zahl){
                    cout << "vorhanden";
                }
            cout<<"Hello World";
    }
    
    Ich probieren gerade nur eine Funktion zu schreiben, die prüft ob überhaupt die Zahl n in a vorkommt. Aber wahrscheinlich stelle ich mich gerade sehr blöd an. Aber es funktioniert nichts. Bitte um Hilfe
        
    
        return 0;
    }
    


  • eingabe.length()==zahl überprüft, ob die Länge (also die Anzahl der Ziffern) gleich der gesuchten Zahl ist - das möchtest du wohl nicht und außerdem ist die Schleife dann nutzlos, da du den Schleifenzähler nicht verwendest.

    Du möchtest eingabe[i] bzw. eingabe.at(i) 😉

    PS: Außerdem hast du noch einen kleinen (off-by 1) Fehler in deiner Schleifenbedingung.



  • Vielen Dank für die Antwort. Wenn ich es mache:

    int main()
    {
        string eingabe = "1233";
        int zahl = 3;
        int ausgabe = 0;
        for (int i = 0; i <= eingabe.length(); i++) {
            if (eingabe.at(i)=='3'){
                    cout << "vorhanden";
                }
            cout<<"Hello World";
    }
        
    
        return 0;
    }
    

    Bekomme ich den folgenden Fehler:

    terminate called after throwing an instance of 'std::out_of_range'
      what():  basic_string::at: __n (which is 4) >= this->size() (which is 4)
    


  • @snboy2010 Der Index des Strings fängt bei 0 an.
    Mit 0, 1, 2, 3 hast du schon alle 4 Stellen abgearbeitet.

    Deine for-Schleife läuft also zu weit.
    Änder das <= in < um.

    Du kannst an die Ziffern der Zahl auch mit Modulo % und Division kommen.



  • Die Aufgabe scheine nicht zu sein "eine Zahl in einer andern Zahl finden" (was soll das bedeuten? Ich die 2 viermal in der 8 drin?), sondern zu zählen, wie oft eine Ziffer in der Dezimaldarstellung einer Zahl vorhanden ist.

    Die naive Methode ist, einfach die Zahl in einen String in Dezimaldarstellung umzuwandeln (scheint bei dir ja gegeben zu sein) und das Zeichen dort zu suchen.

    #include <algorithm>
    #include <string>
    #include <iostream>
    
    ...
    
    std::string eingabe = "1233";
    char ziffer = '3';  // in single quotes
    auto n_found = std::count(eingabe.begin(), eingabe.end(), ziffer);
    std::cout << "Ziffer " << ziffer << " ist " << n_found << " mal vorhanden\n";
    

    Die andere Methode ist, mit Zahlen (statt strings) zu arbeiten.

    Hier musst du dann die Zahl in ihre Zehnerdarstellung umrechnen.

    int count_digit(int eingabe, int search_digit, int base = 10) {
        if (eingabe == 0 && search_digit == 0) return 1;  // Spezialfall führende 0 erlaubt
        int n_found = 0;
        eingabe = std::abs(eingabe);
        // Betrag nehmen, weil: keine Lust zu gucken, wie module mit negativen Zahlen sich verhält
        // (ich glaube, das ist implementierungsabhängig), gut, -int_max geht dann nicht
    
        while (eingabe) {
            int digit = eingabe % base;
            if (digit == search_digit) ++n_found;
            eingabe = eingabe / base;
        }
        return n_found;
    }
    

Anmelden zum Antworten