Der weise Inder und das Schachbrett

Anfaengerin

Mitglied
Ich hab von einer Freundin folgende Aufgabe erhalten:

Sissa ibn Dahir lebte angeblich im dritten oder vierten Jahrhundert n. Chr. in Indien und gilt Legenden zufolge als der Erfinder des Schachspiels beziehungsweise seiner indischen Urform Caturanga. Sein Name ist mit der Reiskornlegende (auch als Schachbrettaufgabe bekannt) verbunden. Die Geschichte ist ein „Gleichnis für die Vielfalt des Schachspiels“, welches die Unerschöpflichkeit der Möglichkeiten und Partieverläufe im Schach versinnbildlicht. Der indische Herrscher Shihram tyrannisierte seine Untertanen und stürzte sein Land in Not und Elend. Um die Aufmerksamkeit des Königs auf seine Fehler zu lenken, ohne seinen Zorn zu entfachen, schuf Dahirs Sohn, der weise Bramahne Sissa, ein Spiel, in dem der König als wichtigste Figur ohne Hilfe anderer Figuren und Bauern nichts ausrichten kann. Der Unterricht im Schachspiel machte auf Shihram einen starken Eindruck. Er wurde milder und liess das Schachspiel verbreiten, damit alle davon Kenntnis nähmen. Um sich für die anschauliche Lehre von Lebensweisheit und zugleich Unterhaltung zu bedanken, gewährte er dem Brahmanen einen freien Wunsch. Dieser wünschte sich Reiskörner: Auf das erste Feld eines Schachbretts wollte er ein Korn, auf das zweite Feld das Doppelte, also zwei, auf das dritte wiederum die doppelte Menge, also vier, und so weiter. Der König lachte und war gleichzeitig erbost über die vermeintliche Bescheidenheit des Brahmanen. Als sich Shihram einige Tage später erkundigte, ob Sissa seine Belohnung in Empfang genommen habe, musste er hören, dass die Rechenmeister die Menge der Reiskörner noch nicht berechnet hätten. Der Vorsteher der Kornkammer meldete nach mehreren Tagen ununterbrochener Arbeit, dass er diese Menge Reiskörner im ganzen Reich nicht aufbringen könne. Nun stellte er sich die Frage, wie das Versprechen eingelöst werden könne. Der Rechenmeister half dem Herrscher aus der Verlegenheit, indem er ihm empfahl, er solle Sissa ibn Dahir ganz einfach das Reis Korn für Korn zählen lassen.

Gib für jede Schachfeldnummer die zugehörige Reiskornzahl aus.

Nun habe ich 2 For-Schleifen ineinander verschachtelt (macht das überhaupt Sinn?), aber z.B. die Math.pow(x,y)-Funktion funktioniert überhaupt nicht und bei der Variablen-Setzung habe ich auch etwas falsch gemacht.

public class WeiserInder {

public static void main(String[] args) {
// TODO Auto-generated method stub

int i = 1;

int j = 0;

for (i = 1; i <= 64; i++);}{ for (j = i -1; j <=63; j++);


int result = Math.pow(2,j);}; System.out.println(i; " "; result
)}




}

}
 

Anhänge

  • Eclipse162024.PNG
    Eclipse162024.PNG
    88,7 KB · Aufrufe: 0

mihe7

Top Contributor
Vorab: poste Code bitte in Code-Tags. In der Toolbar des Editors aus das Symbol </> ganz links klicken.


Nun habe ich 2 For-Schleifen ineinander verschachtelt (macht das überhaupt Sinn?)
Nein.

Math.pow(x,y)-Funktion funktioniert überhaupt nicht
Die Funktion funktioniert garantiert.

Dein Code ist schlicht falsch. Eclipse zeigt Dir ja entsprechende Fehler an.

Übrigens
Java:
for (i = 1; i <= 64; i++);
ist nichts anderes als
Java:
for (i = 1; i <= 64; i++)
    ; // leere Anweisung
Du wiederholst also 64-mal eine leere Anweisung. Das ist nicht das, was Du willst.
 

Anfaengerin

Mitglied
Ich hab es!!!

Java:
public class WeiserInder {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        
                
                int j = 0;

                    
                
                for (j = 0; j <=62; j++) {
                    int i = j + 1;
                    
                    int result = (int) Math.pow(2,j);
                    
                    System.out.println(i + "tes Feld " + result + " Reiskörner");
                
                    
                };
                
        
    
    
    
    }

}
 

Anhänge

  • Eclipse162024-2.PNG
    Eclipse162024-2.PNG
    131,2 KB · Aufrufe: 0

Anfaengerin

Mitglied
Vielleicht noch als kleiner Tipp: schau Dir mal den Wertebereich von int an...
Java:
public class WeiserInder {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        
                
                int j = 0;

                    
                
                for (j = 0; j <=63; j++) {
                    int i = j + 1;
                    
                    long result = (long) Math.pow(2,j);
                    
                    System.out.println(i + "tes Feld " + result + " Reiskörner");
                
                    
                };
                
    
    
    }

}

Ich hab jetzt long genommen. Der geht bis 2^63-1. Meine Freundin meint, sie wird mir die Ungenauigkeit verzeihen.
 

Anhänge

  • Eclipse162024-3.PNG
    Eclipse162024-3.PNG
    108,9 KB · Aufrufe: 0

mihe7

Top Contributor
Erstens bietet Java für große Ganzzahlen BigInteger an. Zweitens brauchst Du kein pow(), weil die Zahl in jeder Iteration einfach verdoppelt wird:
Java:
BigInteger koerner = BigInteger.ONE;
int feld = 1;
do {
    System.out.printf("Feld %d: %s Reiskörner%n", feld, koerner.toString());
    koerner = koerner.multiply(BigInteger.TWO);
    feld++;
} while (feld <= 64);
 

KonradN

Super-Moderator
Mitarbeiter
Ich hab jetzt long genommen. Der geht bis 2^63-1. Meine Freundin meint, sie wird mir die Ungenauigkeit verzeihen.
Das ist vom Prinzip her extrem verwerflich. Du weisst, dass der Wert nicht passt (2^63). Das es hier eine kleine Ungenauigkeit gibt, liegt einfach nur daran, dass nach JLS bei narrowing primitive conversions von Fließkommazahlen bei zu großen werten immer der maximale Wert genommen wird.
(JLS 5.1.3: "The value must be too large (a positive value of large magnitude or positive infinity), and the result of the first step is the largest representable value of type int or long.")

Das scheitert spätestens dann, wenn Du es "optimierst". Denn hier die 2er Potenzen als double zu berechnen ist einfach Quatsch. Da wäre es deutlich günstiger, den Vorwert einfach immer mit 2 zu multiplizieren. Oder eine Bit-Verschiebung um eine Stelle nach links zu machen.

Und da würdest Du dann auf die Nase fallen. Es steht und fällt alles mit den double Berechnungen.

Also hier ist durch Zufall nur eine kleine Abweichung. Wenn man mit Abweichungen leben kann, dann könnte man z.B. auch Double Werte nehmen. (Die wären übrigens sehr genau, denn da kann man ja alles durch 1*2^x ausdrücken. Daher reicht die Genauigkeit der Mantisse immer aus. (Wenn man die Körner aufsummieren würde, dann hätte man hier eine Ungenauigkeit, die durch die Genauigkeit der Mantisse gegeben ist, denn es würde dann immer auf 1.11111....*2^x hinaus laufen und die unteren Felder würde man wegschmeissen. Also mit den 52Bit + der "versteckten 1" hätte man dann vermutlich sozusagen nur die Körner der letzten 53 Felder (Mit dem Wissen kann man sogar vermutlich noch die genaue Abweichung angeben ... ist gerade interessant und vielleicht mal einen Versuch wert :)

Der für mich wichtige Punkt ist aber, dass es eine klare Genauigkeit gibt. Die Abweichungen sind gering im Vergleich zum Wert. Bei Dir ist die Abweichung aber Extrem, dann alle Math.pow(2,j) sind ab 63 gleich. Wenn das Schachspiel also statt 64 nun 65 Felder hättest, dann wäre beim nächsten Feld der Wert schon weniger als die Hälfte
 

Anfaengerin

Mitglied
Das ist vom Prinzip her extrem verwerflich. Du weisst, dass der Wert nicht passt (2^63). Das es hier eine kleine Ungenauigkeit gibt, liegt einfach nur daran, dass nach JLS bei narrowing primitive conversions von Fließkommazahlen bei zu großen werten immer der maximale Wert genommen wird.
(JLS 5.1.3: "The value must be too large (a positive value of large magnitude or positive infinity), and the result of the first step is the largest representable value of type int or long.")

Das scheitert spätestens dann, wenn Du es "optimierst". Denn hier die 2er Potenzen als double zu berechnen ist einfach Quatsch. Da wäre es deutlich günstiger, den Vorwert einfach immer mit 2 zu multiplizieren. Oder eine Bit-Verschiebung um eine Stelle nach links zu machen.

Und da würdest Du dann auf die Nase fallen. Es steht und fällt alles mit den double Berechnungen.

Also hier ist durch Zufall nur eine kleine Abweichung. Wenn man mit Abweichungen leben kann, dann könnte man z.B. auch Double Werte nehmen. (Die wären übrigens sehr genau, denn da kann man ja alles durch 1*2^x ausdrücken. Daher reicht die Genauigkeit der Mantisse immer aus. (Wenn man die Körner aufsummieren würde, dann hätte man hier eine Ungenauigkeit, die durch die Genauigkeit der Mantisse gegeben ist, denn es würde dann immer auf 1.11111....*2^x hinaus laufen und die unteren Felder würde man wegschmeissen. Also mit den 52Bit + der "versteckten 1" hätte man dann vermutlich sozusagen nur die Körner der letzten 53 Felder (Mit dem Wissen kann man sogar vermutlich noch die genaue Abweichung angeben ... ist gerade interessant und vielleicht mal einen Versuch wert :)

Der für mich wichtige Punkt ist aber, dass es eine klare Genauigkeit gibt. Die Abweichungen sind gering im Vergleich zum Wert. Bei Dir ist die Abweichung aber Extrem, dann alle Math.pow(2,j) sind ab 63 gleich. Wenn das Schachspiel also statt 64 nun 65 Felder hättest, dann wäre beim nächsten Feld der Wert schon weniger als die Hälfte
Ahh okay und mit BigInteger passiert das nicht.

Danke auch an Mihe7 für den Code.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Komplexe Zahlen auf verschiedene Weise addieren Java Basics - Anfänger-Themen 18
M String in char-weise vergleichen und ausgeben Java Basics - Anfänger-Themen 5
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
J Input/Output Auf effiziente Weise einen Stream auszulesen Java Basics - Anfänger-Themen 5
T Auf einem Schachbrett bewegen programmieren Java Basics - Anfänger-Themen 2
D Schachbrett (8x8) programmieren Java Basics - Anfänger-Themen 3
B Schachbrett Java Basics - Anfänger-Themen 2
F Best Practice Schachbrett Läufer Java Basics - Anfänger-Themen 11
I Schachbrett aus beliebigen Strings erstellen Java Basics - Anfänger-Themen 3
J Matrix für Schachbrett Java Basics - Anfänger-Themen 6
P Das Schachbrett - Reis Problem Java Basics - Anfänger-Themen 21
H Schachbrett erkennen Java Basics - Anfänger-Themen 19
J Schachbrett mit Hilfe von while-Schleifen Java Basics - Anfänger-Themen 10
J Schachbrett zeichnen Java Basics - Anfänger-Themen 9
E einfaches Schachbrett generieren Java Basics - Anfänger-Themen 9
P Schachbrett Java Basics - Anfänger-Themen 7
P Schachbrett Spiel Nr. 01 Java Basics - Anfänger-Themen 17
P Schachbrett mit N x N Feldern Java Basics - Anfänger-Themen 11
B Schachbrett Java Basics - Anfänger-Themen 17
D Schachbrett frage Teil2 Java Basics - Anfänger-Themen 15
D Schachbrett frage Java Basics - Anfänger-Themen 3
D schachbrett aufbauen Java Basics - Anfänger-Themen 29
I Springer auf Schachbrett Java Basics - Anfänger-Themen 18
M Schachbrett Java Basics - Anfänger-Themen 31
J Schachbrett Java Basics - Anfänger-Themen 6
B [Java] Schachbrett Frage Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben