Nur mithilfe von modulo und Schleifen



  • Hallo,

    folgende Aufgabenstellung: Zwei Zahlen eingeben, beliebig lang, Programm soll herausfinden, wieviele Ziffern beide Zahlen gemeinsam haben:

    #include <iostream>
    
    using namespace std;
    
    int main () {
    
    int zahl1, zahl2, x, y, d, m, n, i=0;
    
    cout << "Zahl 1: " << endl;
    cin >> zahl1;
    
    cout << "Zahl 2: " << endl;
    cin >> zahl2;
    
    m=zahl2;
    n=zahl1;
    
    while (zahl1>0) {
        x=zahl1%10;
        zahl1=zahl1/10;
    
                while (zahl2>0) {
    
                y=zahl2%10;
                zahl2=zahl2/10;
    
                if(x==y) i++;
    
                }
    
         zahl2=m;
    }
    
    if(i==0) cout << "Keine Zahlen gemeinsam!"<< endl;
    if(i>=1) cout << i << " gemeinsam!";
    return 0;
    
    }
    

    Mein Problem: Was kann ich gegen doppelte Ziffern tun? Das Ganze soll nur mit basic Sachen durchgezogen werden können. Sprich: mod, schleifen, if abfrage.

    Danke im Voraus 🙂


  • Mod

    Interessantes Problem. Da ich mal annehme, dass du dir vorhergegangene Ziffern nicht merken darfst, schlage ich vor: Die Anzahl möglicher Ziffern ist übersichtlich (0 bis 9). Mach eine Schleife über alle möglichen Ziffern, prüfe dann ob die Ziffer in den Zahlen vorhanden ist. So wird jede Ziffer garantiert nur einmal gezählt.

    Noch zwei Tipps für ein übersichtlicheres Programm (du wirst später noch einmal dankbar dafür sein):
    1. Variablen erst dort definieren, wo sie benutzt werden, nicht am Funktionsanfang.
    2. Variablen einen sprechenden Namen geben. Ein Programm sollte man wie ein Gedicht lesen können und damit meine ich nicht "MFG" von den Fantastischen Vier, wenn du verstehst 🙂 .

    Entsprechend hast du bei dir im Programm auch schon die Variablen d und n eingeführt, die du überhaupt nicht benutzt (bzw. erst benutzt und dann vergisst), weil du schon in diesem Kurzprogramm den Überblick verloren hast.



  • Wenn die Zahlen beliebig lang sein dürfen, ist "int" der falsche Datentyp. Nimm std::string. Wenn das nicht erlaubt ist, müsstest du mit char arbeiten, da kenne ich mich jetzt aber nicht so genau aus.

    Belassen wir es mal bei int.
    Das Vergleichen würde ich dann so vornehmen:
    b1[i] bzw. b2[i] gibt an, ob die Ziffer i in zahl1 bzw. zahl2 vorhanden ist

    bool b1[10];
    bool b2[10];
    for (int i = 0; i < 10; i++) {
        b1[i] = false;
        b2[i] = false;
    }
    while (zahl1 > 0) {
        b1[zahl1 % 10] = true;
        zahl1 /= 10;
    }
    while (zahl2 > 0) {
        b2[zahl2 % 10] = true;
        zahl2 /= 10;
    }
    int sum = 0;
    for (int i = 0; i < 10; i++) {
         sum += (int) (b1[i] && b2[i]);
    }
    cout << sum << "gemeinsam" << endl;
    

    (nicht getestet!)



  • reicht sowas von der aufgaben stellung her nicht schon?

    #include <iostream>
    
    int main()
    {
    	int zahl1, zahl2;
    	std::cin >> zahl1 >> zahl2;
    
    	int counter = 0;
    	int z1 = zahl1, z2 = zahl2;
    	while( z1%10 == z2%10 )
    	{
    		z1 /= 10;
    		z2 /= 10;
    
    		counter++;
    	}
    
    	std::cout << zahl1 << " und " << zahl2 << " haben " 
                      << counter << " Stellen gemeinsam." << std::endl;
    	return 0x0;
    }
    


  • SeppJ schrieb:

    Interessantes Problem. Da ich mal annehme, dass du dir vorhergegangene Ziffern nicht merken darfst, schlage ich vor: Die Anzahl möglicher Ziffern ist übersichtlich (0 bis 9). Mach eine Schleife über alle möglichen Ziffern, prüfe dann ob die Ziffer in den Zahlen vorhanden ist. So wird jede Ziffer garantiert nur einmal gezählt.

    Noch zwei Tipps für ein übersichtlicheres Programm (du wirst später noch einmal dankbar dafür sein):
    1. Variablen erst dort definieren, wo sie benutzt werden, nicht am Funktionsanfang.
    2. Variablen einen sprechenden Namen geben. Ein Programm sollte man wie ein Gedicht lesen können und damit meine ich nicht "MFG" von den Fantastischen Vier, wenn du verstehst 🙂 .

    Entsprechend hast du bei dir im Programm auch schon die Variablen d und n eingeführt, die du überhaupt nicht benutzt (bzw. erst benutzt und dann vergisst), weil du schon in diesem Kurzprogramm den Überblick verloren hast.

    Werd ich mir merken. Aber ja, Du hast recht, ich bin noch ein ganz blutiger Anfänger. 🙂

    Kann allerdings Deinen Tipp nicht ganz nachvollziehen. Wie soll das Programm merken, welche Zahl schon vorgekommen ist?

    @Ramanujan: Zu advanced leider!

    @Skymosh: Naja, was ist mit 1234 und 1324?



  • ok, dann hab ich mir die aufgabenstellung nicht genug zu gemüte geführt :>


  • Mod

    prim000 schrieb:

    Kann allerdings Deinen Tipp nicht ganz nachvollziehen. Wie soll das Programm merken, welche Zahl schon vorgekommen ist?

    Gar nicht merken. Ich dachte an

    for (ziffer = 0; ziffer < 10; ++ziffer)
    {
     if (ziffer in zahl1)
      {
        if (ziffer in zahl2)
        {
         ++anzahl_gemeinsamer_ziffern;
        }
      }
    }
    

    Das (ziffer in zahlX) schreibst du entweder als Funktion oder wenn du keine Funktionen machen darfst, schreibst du es eben ganz aus. Sollte nicht schwer umzusetzen sein, da es ungefähr schon dem entspricht, was du derzeit in den Zeilen 23-30 stehen hast.



  • SeppJ schrieb:

    prim000 schrieb:

    Kann allerdings Deinen Tipp nicht ganz nachvollziehen. Wie soll das Programm merken, welche Zahl schon vorgekommen ist?

    Gar nicht merken. Ich dachte an

    for (ziffer = 0; ziffer < 10; ++ziffer)
    {
     if (ziffer in zahl1)
      {
        if (ziffer in zahl2)
        {
         ++anzahl_gemeinsamer_ziffern;
        }
      }
    }
    

    Das (ziffer in zahlX) schreibst du entweder als Funktion oder wenn du keine Funktionen machen darfst, schreibst du es eben ganz aus. Sollte nicht schwer umzusetzen sein, da es ungefähr schon dem entspricht, was du derzeit in den Zeilen 23-30 stehen hast.

    Ahh. 🙂

    for (ziffer= 0; ziffer < 10; ziffer++){ //0,1,2,3,4,...
    
    while (zahl1>0) {
        x=zahl1%10;
    
            if (x==ziffer){
    
                while (zahl2>0) {
    
                y=zahl2%10;
                zahl2=zahl2/10;
                if(y==ziffer){i++; break;}
    
                }
            zahl2=m;
            }
    
        zahl1=zahl1/10;
    
    }
    }
    

    Und was passt da jetzt nicht?


  • Mod

    prim000 schrieb:

    Und was passt da jetzt nicht?

    Gute Frage, sieht eigentlich richtig aus. Gibt es Grund zur Klage?



  • Ja.
    Mit zahl1 = 11 und zahl2 = 11 wird 4 ausgegeben, obwohl 1 richtig ist.


  • Mod

    Ich sehe was: Nach Zeile 15 muss noch ein break, sonst zählst du die Ziffern die in der ersten Zahl mehrfach vorkommen ebenfalls mehrfach. Das erklärt aber nur einen Faktor 2.

    Ich habe leider gerade keinen Compiler an diesem Computer, ich kann es daher nicht selber ausprobieren. Das ist jedoch eine gute Gelegenheit für dich, mal selbstständig heraus zu finden, was ein Debugger ist und wie man ihn benutzt. Der Debugger gilt als wichtigstes Werkzeug des Programmierers. Bei diesem Programm sollte das Debuggen ziemlich einfach sein, es ist also optimal, um die Grundlagen zu lernen: Folge dem Programmverlauf schrittweise. Wenn der Verlauf von dem abweicht, was du erwartest, lass dir die Werte der beteiligten Variablen anzeigen und vollzieh nach, was warum passiert. Zur Not mehrmals von vorne anfangen. Extrapunkte, wenn du es schaffst, dir vom Debugger den Wert der Variablen bei jedem Schritt automatisch anzeigen zu lassen.

    Damit solltest du den Fehler schnell finden können.



  • SeppJ schrieb:

    Ich sehe was: Nach Zeile 15 muss noch ein break, sonst zählst du die Ziffern die in der ersten Zahl mehrfach vorkommen ebenfalls mehrfach. Das erklärt aber nur einen Faktor 2.

    Ich habe leider gerade keinen Compiler an diesem Computer, ich kann es daher nicht selber ausprobieren. Das ist jedoch eine gute Gelegenheit für dich, mal selbstständig heraus zu finden, was ein Debugger ist und wie man ihn benutzt. Der Debugger gilt als wichtigstes Werkzeug des Programmierers. Bei diesem Programm sollte das Debuggen ziemlich einfach sein, es ist also optimal, um die Grundlagen zu lernen: Folge dem Programmverlauf schrittweise. Wenn der Verlauf von dem abweicht, was du erwartest, lass dir die Werte der beteiligten Variablen anzeigen und vollzieh nach, was warum passiert. Zur Not mehrmals von vorne anfangen. Extrapunkte, wenn du es schaffst, dir vom Debugger den Wert der Variablen bei jedem Schritt automatisch anzeigen zu lassen.

    Damit solltest du den Fehler schnell finden können.

    Alles klar. Das mit dem Debugger kommt sowieso bald als Thema.

    Danke nochmal für Alles!


Anmelden zum Antworten