# Reis am Schachbrett Programm



## Andreas703 (30. Mai 2005)

Also ich denke das kl Spielchen mit dem Reis am Schachbrett is bekannt aber trotzdem mal die Erklärung 

Ich progge unter Windows mit DevCpp das hatte ich noch vergessen


Auf jedem Feld am Schachbrett kommt 1 Reiskorn mehr
D.h. 1.Feld 1 Korn, 2.Feld 2Körner, 3.Feld 3 Körner, usw.


Jetzt ist die Frage wie schreibe ich ein solches Programm sodas es von hinten ausgegeben wird?( Dies ist ein Schulprojekt und ich check es ned^^)
Was ich unbedingt drinnen haben muss sind arrays

Ich weiß nicht ob der Anfang schonmal richtig ist aber hier mal zum begutachten


```
#include<iostream.h>
#include<conio.h>
#include<math.h>
int main()
{
	unsigned long long x,y,z;
	
	y=1;
	for(x=1;x<65;x++)
	{
		if(x==1)
		{
		 cout<<"1\t1"<<"\n";
	 }
	 else
	 {	  
		   cout<<x;
		   cout<<"\t";
		   y=y*2;
		   cout<<y<<"\n"; 
	   }		   
	}
	getch();
}
```
Falls noch Fragen offen stehen einfach Fragen

mfg Andreas


----------



## Tobias K. (30. Mai 2005)

moin


Was meinst du mit von hinten ausgaben?


mfg
umbrasaxum


----------



## Andreas703 (30. Mai 2005)

damit meine ich vom 65.Feld angefangen bis zum 1.

und das soll eben mit nem array passieren


----------



## vop (30. Mai 2005)

Vermutlich meinst Du mit "von hinten", dass die Berechnung rekursiv definiert ist, etwa so:

Die Anzahl der Reiskörner auf dem Feld 64 ist gleich 2 x die Anzahl der Reiskörner auf dem Feld 63

Oder
  Anzahl[n] = 2 * Anzahl[ n-1] ;

Ferner gilt 
  Anzahl[1] = 1;

Oder wie?

vop


----------



## Tobias K. (30. Mai 2005)

moin




			
				vop hat gesagt.:
			
		

> Ferner gilt
> Anzahl[1] = 1;


Falsch, Anzahl[0]=1 !

@Andreas703

```
#include <windows.h>

int main(int argc, char* argv[])
{
	unsigned long long feld[8*8];
	int x = 2;
	feld[0] = 1;
	
	for(int i=1; i<64; i++)
	{
		feld[i] = feld[i-1] * 2;
	}

	return 0;
}
```
So kannst du das Ausgeben wie du willst.


mfg
umbrasaxum


----------



## Andreas703 (30. Mai 2005)

sry wenn ich nerve aber kann man es mir mit meinem Ansatz vl auch sagen oder isses so wies ich hab unmöglichen mit arrays zu definieren?so wirds mir nämlich mein Lehrer glaub ich nicht glauben^^


----------



## Tobias K. (30. Mai 2005)

moin


Naja, falsch istb dein Ansatz nciht unbedingt, warum erstellst du denn aber kein Array?!
Du "speicherst" den neuen Wert ja immer in y und dieses y müsstest du in nem Array speichern.


mfg
umbrasaxum


----------



## Andreas703 (30. Mai 2005)

ja eben und das kann ich nicht^^


----------



## Tobias K. (30. Mai 2005)

moin



Du definierst das Array am besten so: unsigned long long Feld[8*8];

in deiner Schleife machst du dann z.B.:

```
y=y*2;
Feld[n] = y;
```
und das n wird natürlich bei jedem Durchlauf ein höher gezählt.

Wichtig ist nur das Feld[0] gleich 1 ist!


mfg
umbrasaxum


----------



## jokey2 (30. Mai 2005)

Das bekannte 'Reiskörner auf dem Schachbrett' - Problem geht aber so, daß die Anzahl der Reiskörner mit jedem Feld verdoppelt wird, also F1=1, F2=2, F3=4,...,F64 = 2^63.
 Allgemein: Die Anzahl Reiskörner auf Feld n: F=2^n-1.
 Dann hast Du auf dem letzten Feld 2^63 Reiskörner. Mit Deinem Schachbrett-Problem wären es gerade mal 64, die Anzahl der Reiskörner auf Feld n wäre: F = n.
 Weiterhin:





> damit meine ich vom 65.Feld angefangen bis zum 1.


Ein Schachbrett hat nur 64 Felder.


----------



## Andreas703 (30. Mai 2005)

könnte man mir nochmal das ganze ahand des Beispiels zeigen? Hier nochmal das funktionierende Bsp


(Eigentlich brauch ich eh nur die arrays drin)


```
#include<iostream.h>
#include<conio.h>
#include<math.h>
int main()
{
	unsigned long long x,y,z;
	
	y=1;
	for(x=1;x<65;x++)
	{
		if(x==1)
		{
		 cout<<"1\t1"<<"\n";
	 }
	 else
	 {	  
		   cout<<x;
		   cout<<"\t";
		   y=y*2;
		   cout<<y<<"\n"; 
	   }		   
	}
	getch();
}
```


----------



## yunusemre (1. November 2009)

kann man das programm bitte auch ohne unsigned machen
und vllt so: leicht mit einfachen dingen auch wenn das programm vllt unübersichtlicher wird aber trotzdem weil wenn ich jetzt einige dinge noch nicht gelernt hab, kann ich sie ja nicht verwenden.... versteht ihr wie ichs mein


----------



## sheel (2. November 2009)

Was brauchst du den im Endeffekt, die Anzahl für jedes Feld oder einfach die Gesamtanzahl?
Und warum willst du unsigned nicht verwenden?

Am Beispiel für eine 1-Byte-Variable:
Hat 8 Bit, dh kann 2 hoch 8 Werte annehmen, ist 256.
Normalerweise werden die von -128 bis +127 aufgeteilt (nicht +128, weil 0 braucht auch noch einen Platz)
Bei unsigned wird der negative Bereich weggelassen, dafür gehen sich dann halt doppelt so viel positive aus: Von 0 bis 255 (nicht 256, eben wegen der 0)

Um noch einmal auf signed zurückzukommen: Bei 8 bit von -128 bis +127,
beim genaueren Betrachten ist 127=2^7 -1
Bei 8Byte/64bit (in dem Fall die größte standartmäßig unterstütze C-Variable) geht das dann bis maximal 2^63 -1

Aufs Schachproblem übertragen: Das erste Feld hat 1 Reiskorn =2^0
Das zweite hat 2 =2^1
Drittes: 4=2^2
Viertes: 8=2^3
...
Nr. 64 hat dann 2^63, da 64bit leider grad nur 1 niedriger schaffen, lässt du eben den negativen Bereich weg und kommst dafür doppelt so hoch -> unsigned

Falls du noch die Gesamtanzahl aller Reiskörner brauchst (Geht sowieso nicht ohne unsigned! , wenn nicht einmal das "Vollste" Schachfeld ohne auskommt):
Von der Mathematischen Seite her ist das genau 2^64 -1.

Noch erwähnenswert, falls du es nicht weißt: 2 hoch n ist in C-Schreibweise
1<<n

Die Gesamtanzahl hast du dann beispielsweise so:
unsigned __int64 gesamtanz=1<<64 -1;

Da unsigned 64bit von 0 bis 2^64-1 gehen, könnte das 2^64 allerdings Probleme machen.
Das minus 1 wird ja erst dann gerechnet, davor überschreitet das gerade um 1 den Wertebereich

Vllt. Sicherere Lösung:
unsigned __int64 gesamtanz=1<<63 -1;
gesamtanz=gesamtanz*2 +1;

Kommt aufs gleiche Ergebnis

Gruß


----------

