C++: Schachbrettproblem

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

C++: Schachbrettproblem

Beitrag von naums » Fr Jan 21, 2011 8:46 pm

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
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C++: Schachbrettproblem

Beitrag von Dirty Oerti » Fr Jan 21, 2011 9:09 pm

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 ;)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: C++: Schachbrettproblem

Beitrag von naums » Fr Jan 21, 2011 9:36 pm

genaugenommen könnte ich auch zwei long unsigned int hintereinanderhängen.

std::cout << int1<<int2;

problem nur: wie rechne ich mit dem schwachsinn?
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C++: Schachbrettproblem

Beitrag von cloidnerux » Fr Jan 21, 2011 9:43 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: C++: Schachbrettproblem

Beitrag von naums » Fr Jan 21, 2011 10:06 pm

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.
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C++: Schachbrettproblem

Beitrag von cloidnerux » Fr Jan 21, 2011 10:26 pm

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).
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++: Schachbrettproblem

Beitrag von Xin » Sa Jan 22, 2011 12:02 pm

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. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: C++: Schachbrettproblem

Beitrag von naums » Sa Jan 22, 2011 12:40 pm

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?
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C++: Schachbrettproblem

Beitrag von Dirty Oerti » Sa Jan 22, 2011 1:34 pm

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)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C++: Schachbrettproblem

Beitrag von cloidnerux » Sa Jan 22, 2011 8:41 pm

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
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten