Algorithmus



  • Aufgabe:

    Entwerfen und implementieren sie ein C++ Programm zur Lösung des folgenden Problems:

    Man bestimme alle dreistelligen Zahlen, die durch ihre Ziffern teilbar sind.

    Beispiel: Die Zahl 126 ist durch 1, 2 und 6 teilbar.

    Zahlen, welche die Ziffer 0 enthalten, sollen nicht berücksichtigt werden.

    Könnte mir jmd vllt ein fertiges Programm dazu schreiben?

    Vielen Dank.



  • @ShuraiyaKudo sagte in Algorithmus:

    Könnte mir jmd vllt ein fertiges Programm dazu schreiben?

    Ja, könnte ich.



  • @manni66 sagte in Algorithmus:

    Ja, könnte ich.

    Ich auch. Mache ich aber ebensowenig 🙂



  • @ShuraiyaKudo

    for (int i = 111; i<1000;i++)
    { if (!(i%10)) continue;
      if (i%100 < 10) continue;
      cout << i << ", "
    }
    


  • @DirkB sagte in Algorithmus:

    @ShuraiyaKudo

    for (int i = 111; i<1000;i++)
    { if (!(i%10)) continue;
      if (i%100 < 10) continue;
      cout << i << ", "
    }
    

    Das funktioniert nicht. Schon 113 geht nicht durch 3. Wo prüfst du Teilbarkeit durch Ziffern der Zahl?



  • Ich würde ja gerne Tips dazu abgeben wie man das angehen kann... aber nachdem das nicht gefragt war...



  • @hustbaer kannst du ja trotzdem haha



  • @ShuraiyaKudo Danke 😆
    Aber so lange du nicht vor hast es selbst zu versuchen, ist mir dann doch lieber mir die Arbeit zu sparen.

    ps:
    -1 für Bitte eine Hausübung gemacht zu bekommen
    +1 für Ehrlichkeit
    +1 für Humor

    In Summe nicht schlecht. Die HÜ mach ich dir trotzdem nicht 🙂



  • Tipp: Schreibe dir eine Funktion, die für genau eine Zahl ermittelt, ob sie den Kriterien entspricht. Returne einen bool aus dieser Funktion. Dann packst du das in eine Schleife und fertig.

    Und das Ergebnis sollte mit folgenden Zahlen anfangen: 111, 112, 115, 122, 124, 126, 128, 132, 135, 144, 155, 162, 168, 175, 184, ...



  • @wob sagte in Algorithmus:

    Das funktioniert nicht. Schon 113 geht nicht durch 3. Wo prüfst du Teilbarkeit durch Ziffern der Zahl?

    113/3 = 37,6666666... Check, ist teilbar

    Ganzzahlig oder ohne Rest steht nicht in der Aufgabe.


  • Mod

    Wir wollen hier ja schon Komplettlösungen anbieten. Hier bietet es sich an, template-Metaprogrammierung zu benutzen, da die Grenzen zur Compilezeit bekannt sind. außerdem passt das wunderbar zur maximalen Template-Rekursionstiefe von 900 beim GCC. Zur Ablaufsteuerung haben sich schon immer Exceptions bewährt. Da die Compilierungszeit wegen der Templates hoch ist, sollte man wenigstens den Quelltext möglichst kurz halten, um die Verarbeitungszeit dort niedrig zu halten. Eine kompakte Schreibweise dient auch der Übersichtlichkeit. Kurz gesagt:

    #include <iostream>
    typedef unsigned I;template<I o,I O,void(*i)(I)>struct l{void
    operator()(){i(o);l<o+1,O,i>()();}};template<I i,void(*O)(I)>
    struct l<i,i,O>{void operator()(){}};template<I O> I o(){ret\
    urn o<O-1>()*10;}template<> I o<1>() {return 1;}template<I i>
    struct O{I operator()(I _){I l =_/o<i>()%10;if(!l)throw 1U;r\
    eturn!(_%l);}};void _(I o){try{I l=O<2>()(o)+O<1>()(o)+O<3>()
    (o);if(l)std::cout<<o<<'\n';}catch(I){}}int main(){l<111,1000
    ,_>()();}
    

    https://ideone.com/onahTT

    PS: Oh, es soll durch alle Ziffern gehen, nicht nur durch eine oder mehr. Das macht die Sache natürlich einfacher. Die Änderung (Zeile 8 ) sei dem geneigtem Leser vorbehalten.

    PPS: Da es so einfach ist und der Code so viel schöner:

    #include <iostream>
    typedef unsigned I;template<I o,I O,void(*i)(I)>struct l{void
    operator()(){i(o);l<o+1,O,i>()();}};template<I i,void(*O)(I)>
    struct l<i,i,O>{void operator()(){}};template<I O> I o(){ret\
    urn o<O-1>()*10;}template<>I o<1>(){return 1;}template<I i>s\
    truct O{I operator()(I _){I l =_/o<i>()%10;if(!l) return 0;r\
    eturn!(_%l);}};void _(I o){I c=O<2>()(o)+O<1>()(o)+O<3>()(o);
    if(c==3)std::cout<<o<<'\n';}int main(){l<111,1000,_>()();}
    

    https://ideone.com/ZShPwZ

    PPPS: Hausaufgabe: Verallgemeinerung auf Zahlen mit N Ziffern, und dann ganz allgemein auf Zahlen zwischen N und M



  • @DirkB sagte in Algorithmus:

    Ganzzahlig oder ohne Rest steht nicht in der Aufgabe.

    Teilbarkeit ist aber so definiert. Als allerwichtigste Quelle verweise ich auf https://de.wikipedia.org/wiki/Teilbarkeit

    @SeppJ

    Wir wollen hier ja schon Komplettlösungen anbieten.

    Aber die sollte doch wohl constexpr sein! Macht es nicht Sinn, ein Tupel mit den Zahlen zur Compilezeit zu generieren?


  • Mod

    @wob sagte in Algorithmus:

    Aber die sollte doch wohl constexpr sein! Macht es nicht Sinn, ein Tupel mit den Zahlen zur Compilezeit zu generieren?

    Ich weiß nicht. Mit hoher Optimierung ist der Code beim GCC sehr kompakt:

            movl    $111, %edi
            call    _Z1_j.part.0
            movl    $112, %edi
            call    _Z1_j.part.0
            movl    $115, %edi
            call    _Z1_j.part.0
            movl    $122, %edi
           ...
    

    (wobei _Z1_j.part.0 eine kurze Ausgaberoutine ist). Das war ja gerade das Ziel der Metaprogrammierung.

    Für die Wiederbenutzbarkeit wäre ein Tupel natürlich besser


Log in to reply