Das Schachbrett und der König?
Das Schachbrett und der König Zurück zu: Bedingungen / V... Angeblich soll der Erfinder des Schachspiels als Belohnung beim König einen Wunsch frei gehabt haben. Er wünschte sich nun, dass das Schachbrett mit Reiskörnern gefüllt werden sollte. Und zwar wie folgt: Ein Korn solle auf das erste Feld, zwei auf das zweite, vier auf das dritte, usw. gelegt werden (d.h. auf einem Feld immer doppelt so viele Reiskörner wie auf dem vorangehenden). Der König, der sich über diesen vermeintlich bescheidenen Wunsch wunderte, versprach, der Bitte nachzukommen. Hätte er über einige mathematische Kenntnisse verfügt, so hätte er diese Dummheit sicher nicht begangen ...
Überlegt Euch wie man die Anzahl der Reiskörner berechnen kann. Erstellt ein Struktogramm um das Programm zu schreiben. Benutzt hierfür eine Schleife. Alle Zwischensummen sollen in jeweils einer Zeile ausgegeben werden. Der Text der Zeile soll wie folgt lauten: Die Summe der Reiskörner bis zum Feld "X" ist "SUMME" (Wobei X natürlich die aktuelle Nummer des Feldes sein soll)
Beachtet bitte, dass die letzten Zahlen sehr groß werden und nehmt einen passenden Variablentyp.
Prüft das Ergebnis auf plausibilität.
Hinweis: Ein Schachbrett hat 64 Felder
5 Antworten
Wie sieht denn dein Ansatz aus?
Wenn wir davon ausgehen, dass die Felder von 0 bis 63 durchnummeriert sind, dann ergibt sich, dass auf Feld X insgesamt 2^X Reiskörner liegen. Auf dem letzten Reisfeld liegen dementsprechend 2^63 Reiskörner - das ist eine Zahl mit 18 Stellen. Die Summe wird noch größer, weil die Reiskörner aufsummiert werden. Dementsprechend würde ich einen float oder double als Datentyp nehmen.
Das sind nur ein paar Denkansätze. Wie du schon siehst, will hier keiner deine Hausaufgaben machen. Man hilft dir eher weiter, wenn du zu deinem Ansatz eine konkrete Frage stellst, wo du nicht weiter kommst.
Warum sollte das langsamer sein? Double oder gar Float ist sehr ungenau, da nur ein Teil der Bits Mantisse ist.
Anzahl = sum (i in 0 - 63) 2^i
So nun nur noch programmieren...
Als Datentyp brauchst du ein unsigned long mit 64 Bit. Jedes dieser Bits entspricht einem Feld. Wenn jedes Feld belegt ist, ist jedes Bit gesetzt.
Also kommt man auf 2^64 -1 oder 18.446.744.073.709.551.615 (18 Trillionen, 446 Billiarden, 744 Billionen, 73 Milliarden, 709 Millionen, 551 Tausend, 615).
Am besten tust du die Variablen vor der Schleife definieren.
uint Reiskörner =1
int Feld=1
Dann brauchst du eine For Schleife.
for (int i=1; i<=64;i++)
{Reiskörner=Reiskörner*2;
Feld=Feld+1;
Console.WriteLine("Die Summe der Reiskörner auf Feld"+Feld+" sind "+Reiskörner+" Reiskörner!");}
An welcher Stelle kommst du denn nicht weiter?
BigInteger geht auch, ist aber um Größenordnungen langsamer.