Denkaufgabe



  • Das ist wieder typisch! Du versuchst mich mit der Unendlichkeit zu foppen, aber in der Computer-Realität gibt es Auflösungsgrenzen für den Typ long double (wir beschränken uns brav auf den C++-Standard). Damit ist der kleinste auflösbare Abstand festgelegt und abbildbar. Er ist eben nicht limes gegen null. Damit ist die Aufgabe in der Praxis irgendwie lösbar. Mit dem imaginären bist Du mir bei einer positiven Zahl nicht auf den Leim gegangen, das war klar. 😃

    Warum aber 288 und nicht 42 ? Darüber denke ich nach. 😉

    Jetzt nicht gleich coden, sondern erst mal die Antwort des Auftraggebers abwarten. Immer hübsch iterativ vorgehen. 🙂



  • Erhard Henkes schrieb:

    Das ist wieder typisch! Du versuchst mich mit der Unendlichkeit zu foppen, aber in der Computer-Realität gibt es Auflösungsgrenzen für den Typ long double (wir beschränken uns brav auf den C++-Standard). Damit ist der kleinste auflösbare Abstand festgelegt und abbildbar. Er ist eben nicht limes gegen null. Damit ist die Aufgabe in der Praxis irgendwie lösbar.

    die endlichkeit war mir auch klar. aber selbst wenn du float verwendest, wird die liste verdammt lang und selbst der gutmütigste arbeitgeber würde sie als schwachsinnig abtun.



  • ich vins ein super,an dann prifu

    also ich schreibe euch was per text wenn ihr lest muss ich gehen ok



  • Nur um nochmal zur ursprünglichen Aufgabe zurückzukommen:
    Man drückt einen x-beliebigen Mönch eine Feuerwaffe in die Hand und erteilt ihm den Auftrag, alle Mönche mit einem schwarzen Punkt auf der Stirn umzubringen. Wenn er alle erkrankten Mönche umgebracht hat, gibt er einen gesunden Mönch die Feuerwaffe und der muß den ersten Mönch, wenn er denn erkrankt ist, ebenfalls umbringen.
    Dieser Algorithmus terminiert nicht, wenn a.) Alle Mönche erkrankt sind oder b.) wenn den Mönchen das Morden untersagt ist.

    PS: Was für eine blutige Aufgabe 🙄



  • jo das ist korect wen man ünnerlegt aber wenn nich muss man kucken weil das dann icht stimmt und so



  • Ganz einfach.
    Jeder Mönch schneidet sich ein Stück aus der Stirn heraus. Das macht einer beim Essen - jeder sieht es - sie kapieren es und machen es alle. Da müssen sie nicht mal einen Tag warten...

    btw: Aua! 😉

    /E: Und der der es nicht kapiert und der Kranke ist wird erschossen - soviel Dummheit muss bestraft werden.



  • Für positive Fließkommazahlen habe ich mal was gecodet:

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <conio.h>
    using namespace std;
    
    int main()
    {
      const long double fixzahl = 288   ;
            long double diff    = 1.0   ;
      const int         pr      = 11    ;
      const bool        flag    = false ;
            long double zahl    = 0.0   ;
            long long   laenge  = 0     ;
    
      for( int i=0; i>-15; --i )
      {
        while( zahl <= sqrt( fixzahl ) )
        {
          zahl += diff;
          if( flag )
          { 
            cout << setprecision(pr) <<  zahl  << " * " 
                 << fixzahl/zahl << endl;
          }
          ++laenge;
        }
        cout << "Differenz: " << diff 
             <<" Laenge der Liste: " << laenge << endl;
        diff  /= 10.0 ;
        laenge = 0    ;
        zahl   = 0.0  ;
      }
      getch();
    }
    

    Man sieht hieran deutlich, dass ein Computer nicht brauchbar rechnen kann, wenn man mit dem Taschenrechner nachprüft.

    @Volkard: halbwegs zufrieden? 😃



  • Erhard Henkes schrieb:

    @Volkard: halbwegs zufrieden? 😃

    ich hab nach der ausgabe gefragt.



  • @Volkard: Du musst nur flag auf true setzen, dann purzeln Millionen von Zahlen über die Konsole. 😃



  • Ich habe die Aufgabe mit den Mönchen am Bsp. von 10 Mann (man kann das leicht erweitern/verändern) provisorisch in ein C++-Programm umgesetzt, damit man den Ablauf des Algos besser erkennt:

    #include <set>
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    class moench; 
    set<moench*> alleMoenche; 
    set<moench*>::iterator pos;
    set<moench*>::iterator pos1;
    
    class moench
    {
      private:
        bool gesund_;
        bool lebendig_;
        bool kill_;
        unsigned anzahl_kranke_Moenche_gesehen_;
        unsigned anzahl_tage_noch_abwarten_;
    
      public:
        moench(){alleMoenche.insert(this); kill_ = false; lebendig_= true; gesund_ = true; anzahl_kranke_Moenche_gesehen_=0; anzahl_tage_noch_abwarten_=0; }
        ~moench(){alleMoenche.erase(this);}
        bool is_lebendig() const {return lebendig_;}
        bool is_gesund() const {return gesund_;}
        unsigned wieviele_andere_Moenche_krank() const; // Funktion nachstehend
        void set_gesund(bool val) {gesund_=val;}
        void set_anzahl_Tage_noch_abwarten(unsigned val) {anzahl_tage_noch_abwarten_= val;}
        unsigned get_anzahl_Tage_noch_abwarten() const {return anzahl_tage_noch_abwarten_;}
        void set_selfkill() {kill_= true;}
        bool get_selfkill() const {return kill_;}
        void sich_umbringen() {lebendig_= false;}
    };
    
    unsigned moench::wieviele_andere_Moenche_krank() const
    {
        unsigned count = 0;
        for( pos1 = alleMoenche.begin(); pos1 != alleMoenche.end(); ++pos1)
        {
          if( ( (*pos1)->is_lebendig() == true ) && ( (*pos1) != this ) )
          {
            if( (*pos1)->is_gesund() != true ) count++;  
          }
        } 
        return count;
    }
    
    int main()
    {
      // Moenche ///////////////
      moench M[10];
      M[6].set_gesund(false);
      M[7].set_gesund(false);
      M[8].set_gesund(false);
      M[9].set_gesund(false);
      //////////////////////////
    
      bool krankheit_besiegt = false;
      unsigned tag = 0;
    
      while( krankheit_besiegt == false )
      {
           // Tag anzeigen
           tag++;
           cout << "\nTag: " << tag << endl;
    
           for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos)
           {
             cout << *pos << " sieht Kranke: " << (*pos)->wieviele_andere_Moenche_krank() << endl;
             if ( tag == 1 )
             {
                if( (*pos)->wieviele_andere_Moenche_krank() == 0 ) (*pos)->set_selfkill();
                else (*pos)->set_anzahl_Tage_noch_abwarten( (*pos)->wieviele_andere_Moenche_krank() );
             }
             else
             {
               (*pos)->set_anzahl_Tage_noch_abwarten( (*pos)->get_anzahl_Tage_noch_abwarten() - 1 );
               if( (*pos)->get_anzahl_Tage_noch_abwarten() == 0 )
                   if ( (*pos)->wieviele_andere_Moenche_krank() != 0 ) (*pos)->set_selfkill();
             }
           }  
    
           // Die Nacht der Entscheidung
           for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos)
           {
             if( (*pos)->get_selfkill() ) (*pos)->sich_umbringen();
           }
    
           // Test, ob Krankheit besiegt
           krankheit_besiegt = true;
           for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos)       
           {
             if( !(*pos)->is_gesund() && (*pos)->is_lebendig() ) krankheit_besiegt = false;
           }
    
           // Report            
           for( pos = alleMoenche.begin(); pos != alleMoenche.end(); ++pos)
           {
                cout << *pos << ": " << "gesund = " << (*pos)->is_gesund() << " lebendig = " <<
                (*pos)->is_lebendig() << " Tage warten: " << (*pos)->get_anzahl_Tage_noch_abwarten() << endl;
           }
           getch();
      }
    
      cout << "\nKrankheit besiegt!" << endl;
      getch();
    }
    

    Konstruktive Kritik ist erwünscht. 😉


Anmelden zum Antworten