Advanced  Services C#-Praktikum Back Next Up Home
Der König und seine Gefangenen (Lösung)
public class Koenig1
{
   static void Main(string[] args)
   {
      bool[] tuer = new bool[100] ;
      // false = tür geschlossen
      /*
      idee :
      //alle türen öffnen
      for(int i=0; i<tuer.Length; i++)
         tuer[i] = true ;

      //jede zweite türe schließen ( offen, zu, offen, zu,...)
      for(int i=1; i<tuer.Length; i+=2)
         tuer[i] = false ;

      //jede dritte türe öffnen
      for(int i=2; i<tuer.Length; i+=3)
         tuer[i] = true ;

      idee verallgemeinern:
      */
      // k=0 öffnen, k=1 schließen, k=2 öffnen, k...
      for(int k=0; k<tuer.Length; k++)
      {
         for(int i=k; i<tuer.Length; i+=k+1)
            tuer[i] = k%2==0 ? true : false ;
      }

      int count=0;
      for(int i=0; i<tuer.Length; i++)
         if(tuer[i])
         {
            count++;
            Console.WriteLine(i+1);
         }
      Console.WriteLine("offene Tueren : "+count);

   } // end Main

}


// zweite Variante

public class Koenig2
{
   static void Main(string[] args)
   {
      bool[] tuer = new bool[100] ;
      // false = tür geschlossen

      /*
      idee:
      //alle türen öffnen
      for(int i=0; i<tuer.Length; i++)
         tuer[i] = true ;
         //tuer[i] = !tuer[i];   geht auch

      //jede zweite türe schließen ( offen, zu, offen, zu,...)
      for(int i=1; i<tuer.Length; i+=2)
         tuer[i] = false ;
         //tuer[i] = !tuer[i];   geht auch

      //jede dritte türe öffnen, wenn geschlossen und umgekehrt
      for(int i=2; i<tuer.Length; i+=3)
         tuer[i] = !tuer[i];

      //jede vierte türe öffnen, wenn geschlossen und umgekehrt
      for(int i=3; i<tuer.Length; i+=4)
         tuer[i] = !tuer[i];

      Idee verallgemeinern:
      */

      //jede k-te türe öffnen, wenn geschlossen und umgekehrt
      for(int k=0; k<tuer.Length; k++)
      {
         for(int i=k; i<tuer.Length; i+=k+1)
            tuer[i] = !tuer[i] ;
      }

      int count=0;
      for(int i=0; i<tuer.Length; i++)
         if(tuer[i])
         {
            count++;
            Console.WriteLine(i+1);
         }
      Console.WriteLine("offene Tueren : "+count);

   } // end Main

}
Valid XHTML 1.0 Strict top Back Next Up Home