A25: superlong

A25: superlong

Beitragvon CommanderTomalak » 16.06.2010 21:19

Also ich hab 18.446.744.073.709.551.615 Reiskörner. Und bei dem Gedanken an Essen krieg ich Hunger, sowas gehört als Aufgabe verboten^^

main.cpp
Code: Alles auswählen
#include <iostream>
#include <string>
#include <string.h>
#include "superlong.h"

using namespace std;

void task25();

/** Blablabla, Stuff von Aufgabe 26 und Aufgabenselektor in der main-Schleife, tut hier nix zur Sache **/

/*************************** TASK 25 ***************************/

/**
* Task 25
* Calculate number of rice grains on the chess board
* -> War ja so direkt in der Aufgabe vorgegeben
*/
void task25()
{
    superlong sum ; // Gesamtsumme der Reiskoerner
    sum.set(0) ; // ... diese 0 setzen
   
    superlong k ; // Reiskoerner auf dem aktuellen Feld
    k.set(1) ; // ... startet mit 1
   
   
    for (int i=1; i<=64; ++i)
    {
        cout << "Koernerzahl auf Feld " << i << ": ";
        k.print();
       
        cout << endl;
       
        sum.add(k); // Addiere aktuelle Kornzahl zur Summe
        k.add(k); // Verdopple Kornzahl auf aktuellem Feld
    }
   
    cout << endl << "Summe aller Felder: " ;
    sum.print();
    cout << endl;
   
    return;
}


superlong.h
Code: Alles auswählen
#include <iostream>
#define SIZE 50

using namespace std;

class superlong
{
    public:
        // Constructors
        superlong();
        superlong(int i);
       
        // Public methods
        void set(int i);
        void add(superlong k);
        void print();
       
    private:
        int num[SIZE];
   
};


superlong.cpp
Code: Alles auswählen
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#include "superlong.h"

using namespace std;

superlong::superlong()
{
    set(0);
}

superlong::superlong(int n)
{
    set(n);
}

void superlong::set(int n)
{
    for(int i = SIZE-1; i >= 0; i--)
    {
        // Only the last 5 digits can be initialized with a normal integer (max. ~32.000)
        // The other digits are zero initially
        if(i < SIZE-5) num[i] = 0;
       
        else
        {
            // Write current digit of initializer int to array
            num[i] = n / (int)pow(10, SIZE-i-1);
            n = n % (int) pow(10, SIZE-i-1);
        }
    }
}

void superlong::add(superlong k)
{
    int carryover = 0, t;
   
    for(int i = SIZE-1; i >= 0; i--)
    {
        t = num[i] + k.num[i] + carryover;
       
        num[i] = t % 10;
        carryover = t / 10;
    }
}

void superlong::print()
{
    bool begin = false;
   
    for(int i = 0; i < SIZE; i++)
    {
        if(num[i] != 0 || begin)
        {
            // Thousands seperator
            if((SIZE-i)%3 == 0 && begin) cout << ".";
           
            // Print current digit
            cout << num[i];
           
            // Mark, that number has begun, so zeros within number don't get overleaped
            begin = true;
        }
    }
}


für die Multiplikation und eleganteren Stil mit Operatorüberladung war ich bisher zu faul.
Sollte ich mal Lust haben, bau ich ne Karatsuba-Ofman Multiplikation ein, hier lohnt sich das ja richtig :D
"Das Volk hat das Vertrauen der Regierung verscherzt. Wäre es da nicht doch einfacher, die Regierung löste das Volk auf und wählte ein anderes?"
- Bertolt Brecht
CommanderTomalak
 
Beiträge: 204
Registriert: 19.01.2009 00:42
Wohnort: Karlsruhe

Re: A25: superlong

Beitragvon phys » 19.06.2010 19:05

CommanderTomalak hat geschrieben:Also ich hab 18.446.744.073.709.551.615 Reiskörner. Und bei dem Gedanken an Essen krieg ich Hunger, sowas gehört als Aufgabe verboten^^


Kann ich bestätigen. Sowohl die Reiskörner, als auch das mit dem Hunger.
phys
 
Beiträge: 67
Registriert: 14.06.2009 11:26


Zurück zu Programmieren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron