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
21 Lösung(en)
- python
- java
- java
- groovy
- java
- java
- ruby
- vb
- c
- abap
- javascript
- c
- shell
- java
- csharp
- javascript
- csharp
- python
- cpp
- csharp
- cpp
'''
@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
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (2)
Nein, die 6. Tür muss geschlossen sein, da auch wieder jede 6. Tür geschlossen wird. (Die 6. Tür mit inbegriffen)
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)