PDA

Vollständige Version anzeigen : C++ Algo Fehler



Pikes
17.12.2011, 16:02
Hey Com =),

ich hätte eine kleine Frage an die User, die sich vllt mit C++ beschäftigen.
Wir haben eine kleine Zusatzaufgabe bekommen, die wir doch bitte zu Hause alleine lösen sollen.


"Dodon, der Märchenkönig, nahm bei seinem Feldzug 70 Feinde
gefangen, die er in 70 Einzelzellen steckte. An seinem Geburtstag
sollten einige freigelassen werden, und zwar nach einem ganz eigenartigen
Verfahren (vom Hofmathematiker ausgedacht): Im einem
ersten Durchgang werden alle Zellentüren geöffnet, in einem zweiten
Durchgang wird jede zweite Tür wieder geschlossen. Im dritten
Durchgang wird jede dritte Tür, wenn sie offenstand, geschlossen,
und wenn sie geschlossen war, geöffnet. Und so geht es im vierten,
fünften,... bis zum 70. Durchgang weiter. Die Frage ist, welche
Türen schließlich offenstanden, als der Geburtstag des Königs
anbrach."

Hier der Code


//IT11b
//Datum 18. Dez. 2011

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <conio.h>

using namespace std;

int main()

{
int z=2;
bool Zelle[71];

//1. Durchgang
//Alle Zelltüren aufschließen
cout<<"Durchlauf 1"<<endl;
for(int i=0; i<71; i++)
{
Zelle[i] = true;
cout<<"0";
}
cout<<endl;
//Durchgänge
for(int durchgang = 2; durchgang <= 71; durchgang++)
{
for(int i=1; i<71; i+=durchgang)
{
if(durchgang % 2 == 0) //gerade Durchgänge
{
Zelle[i] = false; //zuschließen
}
else //Ungerade Durchgänge
{
Zelle[i] = !Zelle[i]; //invertieren
}
}

// Ausgabe
cout<<"Durchlauf " <<z++<<endl;

for(int i=0; i<71; i++)
{
if(Zelle[i]==true) cout<<'O';
else cout<<'x';

}

cout<<endl;
system("PAUSE");
}

return 0;
}

Funktionieren tut an sich alles. Nur die Ausgabe ist fehlerhaft glaube ich!? Unsere Lehrerin hat die ersten 3 Durchläufe angegeben:


Durchlauf 1
00000000000000000............
Durchlauf 2
0x0x0x0x0x0x0x0x0x..........
Durchlauf 3
0xxx000xxx000xxx000...........

usw


Bei mir kommt aber das raus:
http://s7.directupload.net/images/111217/g89gxvk4.jpg

Fehlerhaft ist Durchlauf 3

Kann mir evtl jmd. auf die Sprünge helfen!? Dürfte doch eig garnicht sein!?

Liebe Grüße

PS: O steht für offene Zellentür, X für geschlossene Zellentür

Hombre
17.12.2011, 21:24
Ich will deine Hausaufgagen nicht machen. Aber: keine Zahl ist durch eine größere Teilbar. Für jede reicht zu prüfen, ob die kleineren ein Teiler sind.

Ausserdem braucht man zu diesme Problem kein Programm. Jede ungerade Tür bleibt offen - bis auf die Primzahlen. Die Geraden bleiben zu.

Update:
Nee. Es sind nicht die ungeraden, sondern die "Quadratzahlen". Da ist mit mir der Türke durchgegengen.
Also noch mal: nur Quadratzahlen bleiben offen: 2x2=4, 3x3=9, 16, 25, 36, 49 und 64. Ergo alle Zahlen, die ungerade Anzahl der Teiler haben.

Pikes
18.12.2011, 01:28
Sollst Du auch nicht, hab ich ja schon getan ;). Und ja, ich muss dafür ein Programm schreiben, da die Übungsaufgabe aus LF6 Erstellen von Anwendersystemen, sprich Programmierung ist. Aber trotzdem danke :-P. Mir ging es eher darum, wieso im 3. Durchlauf die ersten drei Türen auf sind....meinem Algo nach dürfte nur die erste Tür auf sein.

Harry Krischner
18.12.2011, 03:31
Mit Ihrer Frage sind Sie meiner Meinung nach im völlig falschen Forum, aber weil bald Weihnachten ist ...

Sie haben das mit dem Modulo Operator noch nicht richtig durchdacht. Hier muss ja irgendwie die Nummer der Tür mit der Nummer des Durchlaufs verbunden werden.
Dann müssen Sie nur noch darauf achten, an welcher Stelle Sie natürliche Zahlen verwenden müssen, je nachdem wie Sie ihre Schleifen konstruieren.

Dasselbe in Groovy (http://pastebin.com/raw.php?i=DgXz9D5Z)

Hombre
18.12.2011, 10:30
@Pikes

Dann frag dich, wo du prüfst, ob die Tür durch die verschiedenen Zahlen teilbar sind. Und ob überhaupt.

andreop
18.12.2011, 13:27
Du hast einen falschen Ansatzpunkt. Hier gehts kaum um Teilbarkeit sondern um die Variation der Iterationsschritte.

Hier

for(int durchgang = 2; durchgang <= 71; durchgang++)

soll nicht durchgang++ sondern durchang += iteration_schritt stehen
diese iteration_schritt(sag ich mal it) wird it = 1 initialisiert (ganz oben) und am ende jeder Schleife wird it++ gemacht. Also dann gehste erstmal einer , dann zweier und dann dreier..... Schritte durch die Schleife

In jedem it-Schritt werden die Türen auf- und zu geklappt also das heisst nicht weiter als Zelle[i] = !Zelle[i]; //invertieren, wie du auch richtig gemacht hast

also die Lösung ist ein Vier-zeiler und nicht mehr.. wenn du nicht hinkriegst, schreibe ich hier gerne auf...

Lichtblau
19.12.2011, 15:54
Hey Com =),

ich hätte eine kleine Frage an die User, die sich vllt mit C++ beschäftigen.
Wir haben eine kleine Zusatzaufgabe bekommen, die wir doch bitte zu Hause alleine lösen sollen.



Hier die Lösung in C#:



bool[] Zelle=new bool[71];

for (int durchgang = 1; durchgang <= 70; durchgang++)
{
Console.WriteLine("Durchlauf " + durchgang.ToString());

for (int i = 1; i <= 70; i++)
{
if (i % durchgang == 0) Zelle[i] = !Zelle[i];

if (Zelle[i]) Console.Write("0"); else Console.Write("x");
}

Console.WriteLine("");
}

Console.ReadKey();

raus kommt:
0xx0xxxx0xxxxxx0xxxxxxxx0xxxxxxxxxx0xxxxxxxxxxxx0x xxxxxxxxxxxxx0xxxxxx