Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

Es lebe der König! (Felder)

Ein König nahm bei einem Feldzug 100 feindliche Soldaten gefangen, die er in 100 Einzelzellen sperren ließ. 

An seinem Geburtstag will er durch Großzügigkeit glänzen und plant eine Amnestie der gefangenen Soldaten. 

Allerdings will er nicht alle Soldaten freilassen und fragt deswegen seinen Hofmathematiker, wie er verfahren soll. Dieser antwortet ihm wie folgt: Öffne zunächst alle Türen, schließe sodann jede zweite Türe, öffne nun wieder jede dritte Türe, schließe nun wieder jede vierte Türe und verfahre weiter so bis zum 100. Durchgang. 

Der König ueberlegt eine Weile und sagt dann: Ich habe den Eindruck, bei diesem Verfahren muß ich ziemlich viele Gefangene freilassen. Darauf entgegnet der Hofmathematiker: Nun gut, wenn eure Majestaet meinen, daß auf diese Weise zu viele Gefangene freikommen, so habe ich noch ein zweites Verfahren anzubieten: 

Öffne zunaechst alle Türen, schließe sodann jede zweite Türe, beim dritten Durchgang nehme jede dritte Türe und öffne sie, wenn sie geschlossen ist, bzw. schließe sie, wenn sie geöffnet ist. Im vierten Durchgang wiederum nehme jede vierte Türe und öffne sie, wenn sie geschlossen ist, bzw. umgekehrt. Verfahre nun weiter so bis zum 100. Durchgang. Bei diesem zweiten Verfahren werden weniger Gefangene freikommen. 

Bei welchem Verfahren werden wie viel Türen (nach dem 100.Durchgang) offenstehen und welches sind ihre Tuernummern. Beachten Sie bitte, daß der König vorm-EDV-Zeitalter lebte. Seine Numerierung der Türen beginnt natürlich bei 1 und endet bei 100.

2 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

Kommentare (2)

GlaubenDuMusst 30. Mai 2016 08:52   reply report
denizyoshi
Hier liegt ein Fehler vor:
denn -> wenn man nach der Reihenfolge aus geht, beim 1 Durchgang:
alle Türe öffnen
jede 2 schließen
jede 3 öffnen
jede 4 schießen

muss die 6 Tür offen sein, (jede 3 Tür öffnen)

Nein, die 6. Tür muss geschlossen sein, da auch wieder jede 6. Tür geschlossen wird. (Die 6. Tür mit inbegriffen)
denizyoshi 20. Dezember 2015 18:40   reply report
Hier liegt ein Fehler vor:
denn -> wenn man nach der Reihenfolge aus geht, beim 1 Durchgang:
alle Türe öffnen
jede 2 schließen
jede 3 öffnen
jede 4 schießen

muss die 6 Tür offen sein, (jede 3 Tür öffnen)

21 Lösung(en)

'''
@author: H. Fofana
'''

'''
Erstes Verfahren!
'''

tuer1 =[False] * 100 
tuer2 =[False] * 100


for k in range(0, len(tuer1)):  
            for i in range(0, len(tuer1), k+1): 
                tuer1[i]= k % 2 if (k % 2 ==0) else k % 2 

                

print("Erstes Verfahren!")
print("Türennumer:")
count1 =0
for i in range(0, len(tuer1)):
    if(tuer1[i]):
        count1 = count1 + 1
        print(i +1 ,  end=" ")
        
        
print("\noffene Tueren : " + str(count1))

'''
Zweites Verfahren!
'''
for k in range(0, len(tuer2)): 
            for i in range(k, len(tuer2), k+1):  
                tuer2[i] = not tuer2[i]
                   
                    
                    
print("\nZweites Verfahren!")
print("Türennumer:")                
count2 =0
for i in range(0, len(tuer2)):
    if(tuer2[i]):
        count2= count2 + 1
        print(i+1 , end=" ")
        


print("\noffene Tueren : " + str(count2))

                

Lösung von: Houssein Fofana ()


public class HelloWorld {

	public static void main(String[] args) {
		int count = 0;
		boolean[] gefangene = new boolean[100];
		System.out.println("Erster Durchgang");
		for (int i = 0; i < gefangene.length; i++) {
			gefangene[i] = true;
		}
		for (int j = 0; j < gefangene.length; j++) {
			if (j % 2 == 0) {
				gefangene[j] = false;
			}
		}
		for (int j = 0; j < gefangene.length; j++) {
			if (j % 3 == 0) {

				gefangene[j] = true;
			}
			if (j % 4 == 0) {
				gefangene[j] = false;
			}
		}
		for (int i = 0; i < gefangene.length; i++) {
			if (gefangene[i]) {
				System.out.println((i + 1) + "Tür ist offen.");
				count++;
			}
		}
		System.out.println("Es sind " + count + " Türen offen.");

		count = 0;
		for (int i = 0; i < gefangene.length; i++) {
			gefangene[i] = true;

		}
		for (int j = 0; j < gefangene.length; j++) {
			if (j % 2 == 0) {
				gefangene[j] = false;
			}
		}
		for (int i = 0; i < gefangene.length; i++) {
			if (i % 3 == 0) {
				gefangene[i] = !gefangene[i];
			}
		}

		for (int i = 0; i < gefangene.length; i++) {
			if (i % 4 == 0) {
				gefangene[i] = !gefangene[i];
			}
		}
		System.out.println("Zweiter Durchgang");
		for (int i = 0; i < gefangene.length; i++) {
			if (gefangene[i]) {
				System.out.println((i + 1) + "Tür ist offen.");
				count++;
			}
		}
		System.out.println("Es sind " + count + " Türen offen.");
	}
}

                

Lösung von: Helge Meiering ()

package ch.programmieraufgaben.arrays.langLebeDerKoenig;

// Help to BitWorm: http://www.santis-training.ch/training/java/downloads/hilfsklassen/BitWorm.html
import eu.gressly.util.BitWorm;

/**
 * Es lebe der König
 * Programmieraufgabe auf "www.programmieraufgaben.ch"
 * @version 0.1 (Nov 10, 2015)
 * @author Philipp Gressly Freimann 
 *         (philipp.gressly@santis.ch)
 */
public class LangLebeDerKoenig {
	public static void main(String[] args) {
		new LangLebeDerKoenig().top();
	}


	void top() {
		variante1();
		System.out.println();
		variante2();
	}


	BitWorm initialisiereBitWurmGeschlossen() {
		BitWorm bw = new BitWorm(101); // Position 0 nicht benutzt
		for(int i = 0; i <= 100; i = i+1) {
			bw.set(i, false); // false = geschlossen; true = offen
		}
		return bw;
	}


	void variante1() {
		// false = geschlossen
		BitWorm bw = initialisiereBitWurmGeschlossen();
		boolean oeffne = true;
		for(int durchgang = 1; durchgang <= 100; durchgang = durchgang + 1) {
			for(int tuer = durchgang; tuer <= 100; tuer = tuer + durchgang) {
				bw.set(tuer, oeffne); 
			}
			oeffne = ! oeffne; // nur in jedem 2. Durchgang oeffnen
		}
		System.out.println("Durchgang 1");
		ausgabe(bw);
	}


	void variante2() {
		// false = geschlossen
		BitWorm bw = initialisiereBitWurmGeschlossen();
		boolean oeffne = true;
		// Die ersten beiden Durchgänge sind identisch mit Variante 1
		for(int durchgang = 1; durchgang <= 2; durchgang = durchgang + 1) {
			for(int tuer = durchgang; tuer <= 100; tuer = tuer + durchgang) {
				bw.set(tuer, oeffne); 
			}
			oeffne = ! oeffne; // nur in jedem 2. Durchgang oeffnen
		}
		for(int durchgang = 3; durchgang <= 100; durchgang = durchgang + 1) {
			for(int tuer = durchgang; tuer <= 100; tuer = tuer + durchgang) {
				bw.set(tuer,  !bw.get(tuer));
			}
		}
		System.out.println("Durchgang 2");
		ausgabe(bw);
	}


	void ausgabe(BitWorm bw) {
		int offen = 0;
		System.out.println("Die folgenden Türen sind offen:");
		for(int pos = 1; pos <= 100; pos = pos + 1) {
			if(bw.get(pos)) {
				System.out.print(pos + " ");
				offen = offen + 1;
			}
		}
		System.out.println("\nTotal sind " + offen + " Tueren offen.");
	}

} // end class "LangLebeDerKoenig"

                

Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

def tueren1 = [:]
def tueren2 = [:]

for (i in 1..100)
{
	tueren1[i] = 0
	tueren2[i] = 0
}

for (i in 1..100)
{
	if (i % 2 == 0)
		aufzu = 0
	else
		aufzu = 1
	
	for (j in 1..100)
	{
		if (j % i == 0)
			tueren1[j] = aufzu
	}
}

println "Durchgang 1"
println "Es sind folgende ${tueren1.findAll{it.value == 1}.keySet().size()} Tueren offen:"
tueren1.findAll{it.value == 1}.keySet().each{ k -> print "$k " }

for (i in 1..100)
{
	for (j in 1..100)
	{
		if (j % i == 0)
			tueren2[j] = (tueren2[j]-1).abs()
	}
}
println"\n\nDurchgang 2"
println "Es sind folgende ${tueren2.findAll{it.value == 1}.keySet().size()} Tueren offen:"
tueren2.findAll{it.value == 1}.keySet().each{ k -> print "$k " }

                

Lösung von: Name nicht veröffentlicht

package ch.FastByte22.Programmieraufgaben;

import java.io.IOException;

import javax.swing.JOptionPane;

import com.FastByte22.util.commandprompt;

public class EsLebeDerKönig {
    public static void main(String[] args)
	    throws IOException, InterruptedException {
	Thread.sleep(2000);
	int a = 2, b = 0, opened = 1;
	boolean[] dooropen1 = new boolean[101];
	boolean[] dooropen2 = new boolean[101];
	// Methode 1
	System.out.println("Method 1");
	for (int i = 0; i < dooropen1.length; i++) {
	    dooropen1[i] = true;
	}
	boolean state = false;
	while (a <= 100) {
	    for (int i = 0; i < dooropen1.length; i++) {
		if (i % a == 0) {
		    dooropen1[i] = state;
		}
	    }
	    a++;
	    state = !state;
	}
	System.out.print("Opened Doors:" + "\n1");
	for (int i = 0; i < dooropen1.length; i++) {
	    if (i == 0) {
		i++;
	    }
	    if (i > 1 && dooropen1[i]) {
		System.out.print("," + i);
		opened++;
	    }
	}
	JOptionPane.showMessageDialog(null,
		"Anzahl offene Türen bei Methode 1:" + opened);
	System.out.println("");
	opened = 1;
	// Methode 2
	System.out.println("Method 2");
	a = 2;
	b = 0;
	for (int i = 0; i < dooropen2.length; i++) {
	    dooropen2[i] = true;
	}
	while (a <= 100) {
	    for (int i = 0; i < dooropen2.length; i++) {
		if (i % a == 0) {
		    dooropen2[i] = !dooropen2[i];
		}
	    }
	    a++;
	}
	System.out.print("Opened Doors:" + "\n1");
	for (int i = 0; i < dooropen2.length; i++) {
	    if (i == 0) {
		i++;
	    }
	    if (i > 1 && dooropen2[i]) {
		System.out.print("," + i);
		opened++;
	    }
	}
	JOptionPane.showMessageDialog(null,
		"Anzahl offene Türen bei Methode 2:" + opened);
    }
}

                

Lösung von: David Wu (Gut-genug.com)

public static void main(String[] args) {
//Array Gefangene erstellen
	//true = Türe offen
	boolean [] gefangene = new boolean [101];
	for(int i = 0;i < 101;i++){
		gefangene[i] = true;
	}
//1.Variante
	for(int i = 2;i < 100;i++){
	//Wenn Zahl gerade(ab 2)		
		if(i % 2 == 0){//== nicht = !!
			int e = i;
			while(e <= 100){
				gefangene[e] = false;
				e = e+i;
		}
		}
	//Wenn Anzahl ungerade(ab 3)	
		else if(i % 2 != 0){
			int e = i;
			while(e <= 100){
				gefangene[e] = true;
				e = e+i;
			}
		}
	}
	System.out.println("Variante 1:");
	System.out.println("-----------");
	System.out.println("Offene Türen(Türnummern)");
	for(int i=1;i<=100;i++){
		
		if(gefangene[i] == true){
			System.out.print(i);
			System.out.print("  ");
		}
		else{
			
		}
	}
	for(int i = 0;i < 101;i++){
		gefangene[i] = true;
	}
	
	
//2.Variante
	for(int i = 2;i < 100;i++){	
		int e = i;
		while(e <= 100){
			if(gefangene[e] == true){
				gefangene[e] = false;
			}
			else if(gefangene[e] == false){
				gefangene[e] = true;
			}
			e = e+i;
		}
	}
	System.out.println("\nVariante 2:");
	System.out.println("-----------");
	System.out.println("Offene Türen(Türnummern)");
	for(int i=1;i<=100;i++){
		
		if(gefangene[i] == true){
			System.out.print(i);
			System.out.print("  ");
		}
		else{
			
		}
	}
	}
                

Lösung von: Loris Leuenberger (BiCT AG)

def open(zellen, schrittweite)
  i = schrittweite
  while i <= 100
    zellen[i] = "offen"
    i=i+schrittweite
  end
end

def close(zellen, schrittweite)
  i = schrittweite
  while i <= 100
    zellen[i] = "geschlossen"
    i=i+schrittweite
  end
end

def swap(zellen, schrittweite)
  i = schrittweite
  while i <= 100
    if zellen[i] == "geschlossen"
      zellen[i] = "offen"
    
    elsif zellen[i] == "offen"
      zellen[i] = "geschlossen"
    end
    i = i + schrittweite
  end
end

def statistik(zellen, i)
  offen = 0
  geschlossen = 0
  zellen.each_with_index do |zelle,a|
    if zelle == "offen"
      puts a
    end
  end
end

#Vorgang1
puts "Vorgang 1"
i = 1
zellen = []
while i <= 100
  if i % 2 == 1
    open(zellen, i)
  else
    close(zellen, i)
  end
  i=i+1
end
statistik(zellen, i)

#Vorgang2
puts "Vorgang 2"
i = 1
while i <= 100
  if i == 1 
    open(zellen, i)
  end

  if i == 2 
    close(zellen, i)
  end
  
  if i > 2 
    swap(zellen, i)
  end
  i=i+1
end
statistik(zellen, i)
                

Lösung von: marco unbekannt (Berufskolleg)

Module Module1

    Sub Main()
        Dim türen(100) As String

        For i As Integer = 1 To 100 Step 1
            türen(i) = "offen"
        Next

        For i As Integer = 2 To 100 Step 1
            For j As Integer = 1 To 100 Step 1
                If j Mod i = 0 Then
                    If i Mod 2 = 0 Then
                        türen(j) = "zu"
                    Else
                        türen(j) = "offen"
                    End If
                End If
            Next
        Next

        Console.WriteLine("Durchgang: 1")

        For i As Integer = 1 To 100 Step 1
            Console.WriteLine(i & ": " & türen(i))
        Next

        Console.WriteLine()

        For i As Integer = 1 To 100 Step 1
            türen(i) = "offen"

            If i Mod 2 = 0 Then
                türen(i) = "zu"
            Else
                türen(i) = "offen"
            End If
        Next

        For i As Integer = 3 To 100 Step 1
            For j As Integer = 1 To 100 Step 1
                If j Mod i = 0 Then
                    If türen(j) = "offen" Then
                        türen(j) = "zu"
                    Else
                        türen(j) = "offen"
                    End If
                End If
            Next
        Next

        Console.WriteLine("Durchgang 2: ")

        For i As Integer = 1 To 100 Step 1
            Console.WriteLine(i & ": " & türen(i))
        Next

        Console.ReadLine()


    End Sub

End Module
                

Lösung von: Elias Zech (Optics Balzers)

#include <stdio.h>
void ausgabe(bool zellen[100]) {
	int zaehler = 0;
	for (int i = 0; i < 100; i++) {
		if (zellen[i]) {
			printf("%d ", i + 1);
			zaehler++;
		}
	}
	printf("\n");
	printf("Total sind %d Tueren offen\n", zaehler);
}
int main()
{
	//Verfahren 1
	bool z1[100];
	for (int a = 0; a < 100; a++) { z1[a] = true; }
	for (int i = 2; i < 100; i++) {  //Schrittweite
		int j = i-1;
		do{
			if (i % 2 == 0) {
				z1[j] = false;
				j = j + i;
			}
			else {
				z1[j] = true;
				j = j + i;
			}
		}while (j < 100);
	}
	printf("Verfahren 1: \n");
	ausgabe(z1);

	//Verfahren 2
	bool z2[100];
	for (int a = 0; a < 100; a++) { z1[a] = true; }
	for (int i = 2; i <= 100; i++) {  //Schrittweite
		int j = i -1;
		do {
			if (z2[j]) {
				z2[j] = false;
				j = j + i;
			}
			else {
				z2[j] = true;
				j = j + i;
			}
		} while (j <= 100);
	}
	printf("Verfahren 2: \n");
	ausgabe(z2);
}

                

Lösung von: Name nicht veröffentlicht

REPORT  zkoenig.

DATA: lt_tueren TYPE STANDARD TABLE OF i,
      ls_tueren LIKE LINE OF lt_tueren,
      lv_helper TYPE i,
      lv_helper2 TYPE i,
      lv_mod TYPE i VALUE 2.

* Verfahren 1
" Liste wird befüllt. Index ist die Nummer der Tür und der Wert in der Tabelle steht für offen = 1 oder geschlossen = 0.
DO 100 TIMES.
  ls_tueren = 1. " Startwert 1, da alle Türen am Anfang geöffnet sind.
  APPEND ls_tueren TO lt_tueren.
ENDDO.

" Maximal 100 Durchgänge des Öffnen und Schließens.
WHILE lv_mod <= 100.
  lv_helper2 = lv_mod MOD 2.
  IF lv_helper2 EQ 0. " Wenn die Mod Zahl gerade ist, wird geschlossen.
    LOOP AT lt_tueren INTO ls_tueren.
      lv_helper = sy-tabix MOD lv_mod. " Index wird mit dem aktuellen Mod verrechnet.
      IF lv_helper EQ 0. " Wenn mod = 0
        MODIFY lt_tueren FROM '0'. " Schließen der Türe.
      ENDIF.
    ENDLOOP.
  ENDIF.
  IF lv_helper2 EQ 1. " Wenn die Mod Zahl ungerade ist, wird geöffnet.
    LOOP AT lt_tueren INTO ls_tueren.
      lv_helper = sy-tabix MOD lv_mod. " Index wird mit dem aktuellen Mod verrechnet.
      IF lv_helper EQ 0.
        MODIFY lt_tueren FROM '1'. " Öffnen der Türe.
      ENDIF.
    ENDLOOP.
  ENDIF.
  ADD 1 TO lv_mod. " Mod Zahl wird um 1 erhöht.
ENDWHILE.

" Ausgabe des ersten Verfahrens.
WRITE: 'Verfahren 1:',
       /.

LOOP AT lt_tueren INTO ls_tueren.
  IF ls_tueren = 1.
    WRITE: / sy-tabix.
  ENDIF.
ENDLOOP.

* Stelle Anfangszustand wiederher.
CLEAR: lt_tueren, ls_tueren, lv_helper, lv_helper2, lv_mod.
lv_mod = 2.

* Verfahren 2

DO 100 TIMES. " Liste wird abermals gefüllt.
  ls_tueren = 1.
  APPEND ls_tueren TO lt_tueren.
ENDDO.

WHILE lv_mod <= 100.
  LOOP AT lt_tueren INTO ls_tueren.
    lv_helper = sy-tabix MOD lv_mod.
    IF lv_helper EQ 0.
      IF ls_tueren = 1. " Falls aktueller Wert 1 ist, wird 0 daraus.
        MODIFY lt_tueren FROM '0'.
      ELSEIF ls_tueren = 0. " Falls aktueller Wert 0 ist, wird 1 daraus.
        MODIFY lt_tueren FROM '1'.
      ENDIF.
    ENDIF.
  ENDLOOP.
  ADD 1 TO lv_mod. " Mod Zahl wird um 1 erhöht.
ENDWHILE.

* Ausgabe von Verfahren 2.
ULINE. " optischer Trennstrich.
WRITE: 'Verfahren 2:',
       /.

LOOP AT lt_tueren INTO ls_tueren.
  IF ls_tueren = 1.
    WRITE: / sy-tabix.
  ENDIF.
ENDLOOP.
                

Lösung von: Alexander S. (msg systems)

var dungeon = new Array(100).fill(false);

var Hofmathematiker() {
  this.kannSichKlarAusdrücken = false;
  this.MonateBisZurEnthauptung = 3;
  this.imperativSingularVonNehmen = function() {
    return "Nehme";
}

setTimeout(enthaupteHofmathematiker, Hofmathematiker.MonateBisZurEnthauptung);

function enthaupteHofmathematiker() {
  if (
    Hofmathematiker.kannSichKlarAusdrücken == true &&
    Hofmathematiker.imperativSingularVonNehmen() == "Nimm" &&
    Hofmathematiker.plausibleErklärungDesWortesDurchgang() == true
  )
  Hofmathematiker.erstelleAufgabeNeu(EsLebeDerKönig);
  else {
    killDieDummeSau();
    dungeon.fill(true); // freiheit für alle!
  }
  dungeon[0] = Hofmathematiker.kopf;
  dungeon[99] = Hofmathematiker.rest;     // lissalanda@gmx.at

                

Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)

#include <stdio.h>

#define true 1==1
#define false !true

void printRes(int z[100]) {
	int zaehler = 0;
	for (int i = 0; i < 100; i++)
		if (z[i]) {
			printf("%d ", i+1);
			zaehler++;
		}
	printf("\nInsgesamt %d offene Tueren\n", zaehler);
}

int main(){
	//Verfahren 1
	int z1[100];
	int toggle = true;
	for (int i=1; i<=100; i++){
		for (int j=i-1; j<100; j+=i)
			z1[j] = toggle;
		toggle = !toggle;
	}

	printf("Verfahren 1:\n");
	printRes(z1);

	//Verfahren 2
	int z2[100] = {false};
	for (int i=1; i<=100; i++)
		for (int j=i-1; j<100; j+=i)
			z2[j] = !z2[j];

	printf("Verfahren 2:\n");
	printRes(z2);

	return 0;
}
                

Lösung von: André Trobisch ()

% Programmiert mit und für Matlab


%%%%%%%% Erstes Verfahren: %%%%%%%%

function [openGates] = DerKoenig()

gates = ones([100,1]);
oeffnen_oder_schliessen = 1;

for i=2:100 % jedes i'te tor öffnen/schließen
    oeffnen_oder_schliessen = 1-oeffnen_oder_schliessen;
    
    for j=1:100 % aktuelles tor j
        
        if(mod(j,i) == 0) % Wird geöffnet/geschlossen wenn es eines der i'ten Toore ist
            
            gates(j) = oeffnen_oder_schliessen;
        
        end

    end

end

openGates = sum(gates);

end



%%%%%%%% zweites Verfahren: %%%%%%%%

function [openGates] = DerKoenig()

gates = ones([100,1]);

for i=2:100 % jedes i'te tor öffnen/schließen
    
    for j=1:100 % aktuelles tor j
        
        if(mod(j,i) == 0) % Wird geöffnet/geschlossen wenn es eines der i'ten Toore ist
            
            gates(j) = 1-gates(j);
        
        end

    end

end

openGates = sum(gates);

end
                

Lösung von: Sebastian Nichtern (Technische Universität Hamburg)

package king100;

public class King100 {

		static int countDoors = 100;
		static boolean[] doors;
	
		public static void main(String[] argv) {
			//Variant 1
			doors  = new boolean[countDoors+1];
			int toggle = 1;
			for(int x = 1; x <= countDoors; x++) {
				toggleDoors(x, toggle);
				toggle = toggle*-1;
			}
			printOpen();
			

			//Variant 2
			doors  = new boolean[countDoors+1];
			toggleDoors(1, 1);
			for(int x = 2; x <= countDoors; x++) {
				toggleDoors(x);
			}
			printOpen();
			
		}

		public static void toggleDoors(int indikator, int action) {
			for(int x = indikator; x <= countDoors; x+=indikator){
				if(action == 2) doors[x] = !doors[x];
				else doors[x] = (action==1)?true:false;
			}
		}
		public static void toggleDoors(int indikator) {
			toggleDoors(indikator, 2);
		}
		
		public static void printOpen() {
			String output = "";
			for(int x = 1; x <= countDoors; x++) {
				if (doors[x] == true)
					output += x+", ";
			}
			System.out.println("Folgende Türen stehen nun offen: "+output);
		}
		
}

                

Lösung von: Daniel Peters ()

using System;
using System.Collections.Generic;
using System.Linq;

namespace King
{
    internal class Program
    {
        static readonly ICollection<HoldingCell> cells;

        static Program()
        {
            // Create 100 cells.
            cells = Enumerable
                .Range(1, 100)
                .Select(x => new HoldingCell())
                .ToList();
        }

        static void Main()
        {
            ProcedureOne();
            ProcedureTwo();

            Console.ReadKey();
        }
        
        static void ProcedureOne()
        {
            bool flag = false;

            for (int i = 1; i <= cells.Count; i++)
            {
                flag = !flag;   // Flip door open/close switch.

                foreach (HoldingCell cell in cells)
                {
                    if (cell.Id % i == 0)
                    {
                        cell.IsDoorOpen = flag;
                    }
                }
            }
            
            PrintOut(1, cells);
        }

        static void ProcedureTwo()
        {
            for (int i = 1; i <= cells.Count; i++)
            {
                foreach (HoldingCell cell in cells)
                {
                    if (i == 1) // Open all doors in the first place.
                    {
                        cell.IsDoorOpen = true;
                    }
                    else if (cell.Id % i == 0)
                    {
                        cell.IsDoorOpen = !cell.IsDoorOpen; // Open/close door if closed/open.
                    }
                }
            }

            PrintOut(2, cells);
        }

        static void PrintOut(int procedure, IEnumerable<HoldingCell> cells)
        {
            IEnumerable<HoldingCell> openCells = cells.Where(x => x.IsDoorOpen == true);

            string openDoorsText = String.Join(", ", openCells.Select(x => x.Id));

            Console.WriteLine("Variante {0}:", procedure);
            Console.WriteLine("Anzahl der offenen Türen: {0}", openCells.Count());
            Console.WriteLine("Offene Türen: {0}", openDoorsText);
        }
    }

    internal class HoldingCell
    {
        static int counter = 0;

        public HoldingCell()
        {
            this.Id = ++counter;
        }

        public int Id { get; set; }
        public bool IsDoorOpen { get; set; }
    }
}
                

Lösung von: Manu Fx ()

var türen =[];
var türen2 = [];

for(var bi=1; bi<=100; bi++){
  for(var i=1; i<=100; i = i + bi){
    if( i % 2 == '0'){
      türen2[i] = 0;
    }else{
      türen2[i] = 1;
    }
  }
}
console.log(türen2);
for(var di=1; di<=100; di++){
  for(var qi=1; qi<=100; qi = qi + di){
    if( qi % 2 == '0'){
      türen[qi] = 0;
    }else{
      türen[qi] = 1;
    }
  }
}
for(var gi=3; gi<=100; gi++){
  for(var si=0; si<=100; si = si + gi){
    if( türen[si] == 1){
      türen[si] = 0;
    }else{
      türen[si] = 1;
    }
  }
}
console.log(türen);
for(var ei =1; ei<=100; ei++){
  if(türen[ei] == 1){
    document.write(ei+':'+türen[ei]+'<br/>');
  }
}
                

Lösung von: Name nicht veröffentlicht

using System;
using System.Linq;

namespace König_Gefangene
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Verfahren 1: " + VerfahrenEins().Where(x => x).Count());
            Console.WriteLine("Verfahren 2: " + VerfahrenZwei().Where(x => x).Count());
        }

        static bool[] VerfahrenEins()
        {
            bool[] res = new bool[100];
            bool open = true;


            for (int i = 1; i <= res.Length; i++)
            {
                for (int k = 1; k <= res.Length; k++)
                    if (k % i == 0)
                        res[k - 1] = open;

                open = !open;
            }     

            return res;
        }

        static bool[] VerfahrenZwei()
        {
            bool[] res = new bool[100];

            for (int i = 1; i <= res.Length; i++)
            {
                for (int k = 1; k <= res.Length; k++)
                    if (k % i == 0)
                        res[k - 1] = !res[k - 1];

            }

            return res;
        }
    }
}

                

Lösung von: Tobias Golz (Wilhelm Büchner Hochschule)

def showDoors(doors):
    count = 0
    for x in range(0, 100):
        if doors[x] == True:
            count += 1
            print("Door " + str(x + 1) + " is open")
    print(str(count) + " Doors are open. So " + str(100 - count) + " Doors are locked")

def switch(ct, doors, a):
    if ct == "auf":
        changeTo = True
    elif ct == "zu":
        changeTo = False
    x = a - 1
    while x < len(doors):
        if ct == "switch":
            changeTo = not doors[x]
        doors[x] = changeTo
        x = x + a
    return doors

def rec(method):
    doors = [False]*100
    i = 1
    if method == 1:
        changeTo = "auf"
    else:
        changeTo = "switch"
    
    for x in doors:
        doors = switch(changeTo, doors, i)
        
        if changeTo == "auf":
            changeTo = "zu"
        elif changeTo == "zu":
            changeTo = "auf"

        i = i + 1
    showDoors(doors)

if __name__ == "__main__":
    rec(1)
    rec(2)
                

Lösung von: Name nicht veröffentlicht

#include <iostream>
using namespace std;

int main(){
	
	short increment = 1, openDoors = 0;

    cout << "Durchgang 1:\n";
    for (short i = 1; i < 100; i += 2) {
        cout << i << " ";
        openDoors++;
    }

    cout << "\nTotal sind " << openDoors << " Tueren offen.\n\n";
    openDoors = 0;  // counter reset

    cout << "Durchgang 2:\n";
    for (short i = 1; i <= 100; i += increment) {
    	cout << i << " ";
        openDoors++;
        increment += 2;
    }

    cout << "\nTotal sind " << openDoors << " Tueren offen.";
    getchar();  // endl
}
                

Lösung von: Name nicht veröffentlicht

using System;

namespace lebe_der_König
{
    class Program
    {
        static void Main()
        {
            byte increment = 1, openDoors = 0;
            string endText = "\nTotal sind {0} Türen offen.";

            Console.WriteLine("Durchgang 1:");
            for (byte i = 1; i < 100; i += 2) {
                Console.Write(i + " ");
                openDoors++;
            }

            Console.WriteLine(endText, openDoors);
            openDoors = 0;  // counter reset

            Console.WriteLine("\nDurchgang 2:");
            for (byte i = 1; i <= 100; i += increment) {
                Console.Write(i + " ");
                openDoors++;
                increment += 2;
            }

            Console.Write(endText, openDoors);
            Console.ReadKey();  // endl
        }
    }
}

                

Lösung von: Name nicht veröffentlicht

// C++ 17 | VS-2022
#include <iostream>
#include <vector>
#include <algorithm>
constexpr size_t DOORS{ 100 };

/*
Man hätte hier natürlich auch mathematisch z.B. mit "(int)sqrt(100)"
herangehen bzw. aufgrund der Checksumme einen Algorithmus ableiten
können, um die Anzahl der offenen Türen zu ermitteln.
Hier aber die ausführliche Variante:
*/

void first_try(std::vector<bool>& v) {
    for (size_t i{ 1 }; i <= DOORS; ++i)
        for (size_t k{ 1 }; k <= DOORS; ++k)
            if (k % i == 0)
                v[k - 1] = !(i % 2 == 0);
}

void second_try(std::vector<bool>& v) {
    for (size_t i{ 2 }; i <= DOORS; ++i)
        for (size_t k{ 1 }; k <= DOORS; ++k)
            if (k % i == 0)
                v[k - 1] = !v[k - 1];
}

void print_doors(const std::vector<bool>& v) {
    const auto od{ std::count_if(v.begin(), v.end(), [](auto x) { return x; }) };
    std::cout << "opened doors: " << od << "\n";
    for (auto i{ 0 }; i < v.size(); ++i)
        if (v[i]) std::cout << i + 1 << "\n";
}

int main() {
    std::vector<bool> v1(DOORS, true), v2{ v1 };
    first_try(v1);
    print_doors(v1);
    second_try(v2);
    print_doors(v2);
}

                

Lösung von: Jens Kelm (@JKooP)

Verifikation/Checksumme:

Durchgang 1
Die folgenden Türen sind offen:
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
Total sind 50 Tueren offen.

Durchgang 2
Die folgenden Türen sind offen:
1 4 9 16 25 36 49 64 81 100
Total sind 10 Tueren offen.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 0.25
Schwierigkeit: Leicht
Webcode: i33b-cg32
Autor: ()

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen