Seite 1 von 2

C++: Schachbrettproblem

Verfasst: Fr Jan 21, 2011 8:46 pm
von naums
Hallihallöchen,

Ihr kennt doch denke ich alle das Schachbrettproblem: Ein Reiskorn wird aufs erste Feld gelegt, dann die doppelte anzahl aufs zweite, wieder die doppelte aufs dritte, usw. Ich versuche grade ein kleines Programm zu schreiben (für eine 32bit Maschine) die ausrechnen soll, wie viele Reiskörner auf einem eingegebenen Feld liegen, und wie viel Reis auf allen Feldern bis dahin liegt. Problem nur: long unsigned int kommt reicht nicht bis an die zahl ran. Gibts eine Möglichkeit, dass ich trotzdem alle Zahlen bis 9229372036412835568 (ich hatte vieeeeeel Spaß) in einer Variable speichern kann? (char kommt nicht in Frage, weil ich mit den Zahlen weiterrechnen muss.)

PS: Mein jetziger Algorithmus:

Code: Alles auswählen

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

int main (int argc,char* argv[])
{
    if (argc!=2)
    {
        std::cout<<"Sie haben mehr oder weniger Parameter als einen übergeben.\nDas Programm wird nun beendet.\n\n";
        std::cout<<"Benutzung des Programms: \nAufruf in der Kommandozeile mit dem Parameter 1-64 als Angabe des Schachfeldes.";
        exit(5);
    }
    
    int eingabe=atoi(argv[1]);
    long unsigned int felder[eingabe+1];
    felder[1]=1;
    long unsigned int insg =1;
    int count=2;
    std::cout<<eingabe<<"\n\n";
    
    while (count < eingabe)
    {
        std::cout<<"Feld "<<count<<":";
        felder[count]=felder[count-1]*2;
        insg+=felder[count];
        std::cout << felder[count] <<"\ninsgesamt:"<< insg<<"\n\n";
        count++;
    }
    
    std::cout<<"\n\nDas "<<eingabe<<". Feld: "<<felder[eingabe-1]<<"\n";
    std::cout<<"Alle Felder bis zum "<<eingabe<<". Feld: "<<insg<<"\n";
    getchar();
}

MfG Naums

Re: C++: Schachbrettproblem

Verfasst: Fr Jan 21, 2011 9:09 pm
von Dirty Oerti
Entweder du schreibst dir eine Klasse selbst, die beliebige große Zahlen verwalten kann (zwei unsigned ints ergeben z.B. 64 Bit), dann musst du dir aber auch die Rechenoperationen dafür selbst schreiben (ein 32 bit Rechner weiß nicht, wie man 64 Bit addiert/multipliziert) oder du nimmst für das Vorhaben eine Bibliothek, die dir selbiges ermöglicht.
Ich würde dir dabei den ersten Weg anraten, dabei lernt man viel.
Aber es ist ein nicht zu unterschätzender Aufwand .. vor Allem, wenn du keine Maximalbegrenzung für deine Zahlen möchtest.

Bibliotheken sind z.B. http://gmplib.org/ oder vergleichbares ;)

Re: C++: Schachbrettproblem

Verfasst: Fr Jan 21, 2011 9:36 pm
von naums
genaugenommen könnte ich auch zwei long unsigned int hintereinanderhängen.

std::cout << int1<<int2;

problem nur: wie rechne ich mit dem schwachsinn?

Re: C++: Schachbrettproblem

Verfasst: Fr Jan 21, 2011 9:43 pm
von cloidnerux
problem nur: wie rechne ich mit dem schwachsinn?
Es ist kein Schwachsinn.
Wie Dirty oerty scoh gesagt hat, wenn du keine Variablen hast, die groß genug sind, musst du selber ein Datentyp entwickeln. Und für Ints nutzt du einfach 2 Variablen.
Jetzt musst du natürlich zusehen, das z.B bei Additionen einen Übertrag zwischen den beiden Variablen hast. Eine Subtraktion ist im Grunde nur das addieren des 1-er Komplements.
Eine Multiplikation ist schwieriger, wäre aber auch nur eine hintereinander geschachtelte Addition(hab grad keine andere Lösung, diese ist aber SCHLECHT).
Das musst du nur in eine Klasse gießen und Operatoren überladen.
Problem gelöst.

Re: C++: Schachbrettproblem

Verfasst: Fr Jan 21, 2011 10:06 pm
von naums
ich sagte "schwachsinn" weil ich mich noch düster an mein Praktikum errinnere, wo ich 2 register zu 16 bit zusammenlegen sollte/musste ;) leider hab ich den Assembler code net mehr.

Ich glaube ich nehme jetzt erstmal GNU MP und schau mir das mal etwas genauer an :D

PS: muss ich da die 32bit Maschine verändern, dafür? Und auf Windows muss es außerdem laufen :( verdammt.

thx.

Re: C++: Schachbrettproblem

Verfasst: Fr Jan 21, 2011 10:26 pm
von cloidnerux
Nehmen wir uns nochmal unsere aussagen:
Und für Ints nutzt du einfach 2 Variablen.
Ergo, du kannst zwei kleinere Variablen nehmen und die per Software Multiplizieren => Funktioniert auf 8, 16, 32, 64, 128 oder 256 Bit, wenn du umbedingt willst.
Dabei ist es auch egal ob Windows, Linux, Mac, BSD oder Aeris^^

Noch ein kleiner Tipp am Rande: Versuche Professioneller zu wirken und zu handeln(Ist nichts gegen dich, ich kenne dich nicht außerhalb des Forums und muss für meine Aussagen meine Subjektive Sicht der Dinge nutzen). Versuche deswegen ein Problem erst selbst zu Analysieren, Interpretieren und zu Lösen, anstatt gleich andere zu Fragen. Denn nur wer seinen Verstand nutzen kann, kann wirklich was erreichen(Ich war auch mal zu naiv...leider).

Re: C++: Schachbrettproblem

Verfasst: Sa Jan 22, 2011 12:02 pm
von Xin
naums hat geschrieben:genaugenommen könnte ich auch zwei long unsigned int hintereinanderhängen.

std::cout << int1<<int2;
Das ist kein Hintereinanderhängen von Integers, sondern eine Bitverschiebung. (Warum steht da noch FIXME «kerli/dani93?).
naums hat geschrieben:problem nur: wie rechne ich mit dem schwachsinn?
Im Idealfall gar nicht, dafür hast Du ja den Computer.

Code: Alles auswählen

int result = int1;
while( int2-- ) result *= 2;
cloidnerux hat geschrieben:Noch ein kleiner Tipp am Rande: Versuche Professioneller zu wirken und zu handeln(Ist nichts gegen dich, ich kenne dich nicht außerhalb des Forums und muss für meine Aussagen meine Subjektive Sicht der Dinge nutzen). Versuche deswegen ein Problem erst selbst zu Analysieren, Interpretieren und zu Lösen, anstatt gleich andere zu Fragen. Denn nur wer seinen Verstand nutzen kann, kann wirklich was erreichen(Ich war auch mal zu naiv...leider).
Wie alt bist Du eig? Du gehst jetzt auf die 20 zu? Irgendwo so in der Ecke?
Joah, mir ist Deine Entwicklung von nicht so professionell Wirkenden mit teils bedenklicher Rechtschreibung über 1300 Posts zu jemanden mit kompetenten Aussagen durchaus auch aufgefallen und auch Deine Schreibweise wirkt viel besser (obwohl Groß- und Kleinschreibung auch noch was hakt). ^^
Erlauben wir Jedem seine eigene Entwicklung vom wenig Professionellen zum Kompetenten. :-)

Re: C++: Schachbrettproblem

Verfasst: Sa Jan 22, 2011 12:40 pm
von naums
Ich verstehe deinen Code net so ganz. Ich versuch mal den ganzen Algorithmus hier darzustellen, und dann versteh ich vllt. so das hinmuss:

Code: Alles auswählen

[Start]->[Eingabe eines Ints als Feldnummer]->[2^(Feldnummer-1) (schleife)]->[Alle Ergebnisse von 2^(x) Df=(x€R;x<Feldnummer)]->[Ausgabe]->[Ende]
Und wo muss da dein Codestück hin?

Re: C++: Schachbrettproblem

Verfasst: Sa Jan 22, 2011 1:34 pm
von Dirty Oerti
Mit zwei Zeilen wirst du nicht auskommen ... ;)

Um mal das Prinzip zu verdeutlichen:

X: (x1 * 2^0) + (x2 * 2^16) + (x3 * 2^32) + (x4 * 2^48)

Das ist eine 64 Bit Zahl, dargestellt durch 16 Bit (short) Komponenten :) (x1...x4 sind die Komponenten)
Jetzt musst du dir nur überlegen, wie man solche Polynome addiert (einfach) und multipliziert (knifflig) oder wie man effektiv 2^[Große Zahl] berechnet (trickreich, wenn man nicht über Multiplikation geht)

Re: C++: Schachbrettproblem

Verfasst: Sa Jan 22, 2011 8:41 pm
von cloidnerux
Wie alt bist Du eig? Du gehst jetzt auf die 20 zu? Irgendwo so in der Ecke?
Joah, mir ist Deine Entwicklung von nicht so professionell Wirkenden mit teils bedenklicher Rechtschreibung über 1300 Posts zu jemanden mit kompetenten Aussagen durchaus auch aufgefallen und auch Deine Schreibweise wirkt viel besser (obwohl Groß- und Kleinschreibung auch noch was hakt). ^^
Vlt klemmt die Shift-Taste manchmal ;)
Aber im Alter hast du dich leicht verschätz, um ca 4 Jahre :D