Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Fakultät, so schnell wie möglich

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
25.04.2003, 20:43 Uhr
~0xdeadbeef
Gast


...und zwar in C++. Ich möchte den schnellsten Weg sehen, in C++ ein Programm zu schreiben, dass mir n! bis n = 23 ausgibt. Kleiner Wink mit dem Zaun: Ich liebe templates
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.04.2003, 22:49 Uhr
~dsk
Gast


hi, dein wink galt dem meta-programming?


C++:
template<int i>
class fact {
  public:
    static const int f = i * fact<i-1>::f;
};

class fact<1> {
  public:
    static const int f = 1;
};
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.04.2003, 11:44 Uhr
~0xdeadbeef
Gast


Meta-Programming war meine Idee dazu. Aber damit kommst du nicht bis 23!. Kleiner Tipp: Wenn du statt int einen unsigned long long benutzt, kommst du schon bis 20!... (auf 32 bit-Maschinen).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.04.2003, 13:15 Uhr
virtual
Sexiest Bit alive
(Operator)


[unsigned] long long is nicht Bestandteil von ANSI C++, somit ist Die Aufgabe so nicht lösbar.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.04.2003, 15:25 Uhr
~0xdeadbeef
Gast


Hups... Na gut, dann stell dir vor, du arbeitest auf nem 64bit-System und verwendest nen unsigned long. Ich wollte mit der Aufgabe auf zwei Dinge raus, das eine war das template metaprogramming. Das andere ist mathematischer Natur.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.04.2003, 12:30 Uhr
virtual
Sexiest Bit alive
(Operator)


Nun seis drum, es sei dies mein 1000ster Post. Ich habe mal die aufgabe erweitert, mit Hilfe von ANSI C++ Beefies Aufgabe zu lösen und dabei auch bis 1000! zu rechnen. Dürfte nur unwesentlich anderes Laufzeitverhalten haben, wie eine Template basierte Lösung:
Da eigentliche Program lautet:

C++:
#include <iostream>

int main()
{
const char* facts[] = {
#include "fact.dat"
    ,
    NULL
};

    for(int i=0; facts[i]; ++i)
        std::cout<<i<<"! = "<<facts[i]<<std::endl;
}


Der Scharfe Beobachter fragt sich natürlich, woher die fact.dat Datei kommen mag. Diese Makefile erklärt es:

C++:
all : fact

clean:
    rm -rf *.o *.dat bigint fact

fact: fact.o
    g++ -ofact fact.o

fact.o : fact.cpp fact.dat
    g++ -c -ofact.o fact.cpp

fact.dat: bigint
    ./bigint >fact.dat

bigint : bigint.cpp
    g++ -obigint bigint.cpp


Tja, also braucht man noch die Datei bigint.cpp:

C++:
#include <string>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <iterator>

std::string stradd(
    const std::string& s1,
    const std::string& s2)
{
    int l1 = s1.size();
    int l2 = s2.size();
    int l = std::max(l1, l2);
    std::string r;
    int ut = 0;

    for(int i=0; i<l; ++i)
    {
        int d = ut+(i>=l1? 0:s1[i]-'0') + (i>=l2? 0:s2[i]-'0');
        r += char(d%10+'0');
        ut = d/10;
    }
    if (ut) r +='1';

    return r;
}

std::string strmul(
    const std::string& s1,
    const std::string& s2)
{
    int l1 = s1.size();
    int l2 = s2.size();

    std::string r = "0";

    for(int i=0; i<l1; ++i)
    {
        int ut = 0;
        int f = s1[i]-'0';
        if (f)
        {
            std::string t(i, '0');
            for(int j=0; j<l2; ++j)
            {
                int d = ut+(s2[j]-'0')*(s1[i]-'0');
                ut = d/10;
                t += char(d%10+'0');
            }
            if(ut) t+= char(ut+'0');
            r = stradd(t,r);
        }
    }

    return r;
}

int main()
{
    std::string s("1");
    std::string i("0");

    std::cout << "\"1\"" << std::endl;
    while(i != "0001")
    {
        i = stradd(i, "1");
        s = strmul(s, i);
        std::cout << ",\n\"";
        std::copy(s.rbegin(), s.rend(), std::ostream_iterator<char>(std::cout));
        std::cout << "\"";
    }
}


edit by virtual: Kleiner Bugfix
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 28.04.2003 um 12:52 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
28.04.2003, 12:53 Uhr
~0xdeadbeef
Gast


Bastard. Ist zwar streng genommen kein reines C++, aber trotzdem genial. Na gut, hier ist das, was ich mir so ungefähr gedacht hatte:

C++:
#include <iostream>

template <int i> class factorial {
public:
  static const unsigned long long amount = i * factorial<i-1>::amount / (i%5 ? 1 : 10);
  static const int zehnerpotenz = factorial<i-1>::zehnerpotenz + (i%5 ? 0 : 1);
};
class factorial<0> {
public:
  static const unsigned long long amount = 1;
  static const int zehnerpotenz = 0;
};

template <int i> class main_loop {
public:
  static void body() {
    main_loop<i-1>::body();
    std::cout << i << "!:\t" << factorial<i>::amount;
    for(int j = 0; j < factorial<i>::zehnerpotenz; ++j) {
      std::cout << 0;
    }
    std::cout << std::endl;
  }
};
class main_loop<-1> {
public:
  static void body() {}
};

int main(int argc, char *argv[]) {
  main_loop<23>::body();
  return 0;
}


basiert darauf, dass n! immer durch 10^(n div 5) teilbar ist. Damit kriegt man nochmal 3 Extra-Fakultäten rausgeholt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
28.04.2003, 12:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Übrigens gilt:

Code:
1000! = 4023872600770937735437024339230039857193748642107146325437999104299385123986290205920442084869
694048004799886101971960586316668729948085589013238296699445909974245040870737599188236277271887325197
795059509952761208749754624970436014182780946464962910563938874378864873371191810458257836478499770124
766328898359557354325131853239584630755574091142624174743493475534286465766116677973966688202912073791
438537195882498081268678383745597317461360853795345242215865932019280908782973084313928444032812315586
110369768013573042161687476096758713483120254785893207671691324484262361314125087802080002616831510273
418279777047846358681701643650241536913982812648102130927612448963599287051149649754199093422215668325
720808213331861168115536158365469840467089756029009505376164758477284218896796462449451607653534081989
013854424879849599533191017233555566021394503997362807501378376153071277619268490343526252000158885351
473316117021039681759215109077880193931781141945452572238655414610628921879602238389714760885062768629
671466746975629112340824392081601537808898939645182632436716167621791689097799119037540312746222899880
051954444142820121873617459926429565817466283029555702990243241531816172104658320367869061172601587835
207515162842255402651704833042261439742869330616908979684825901254583271682264580665267699586526822728
070757813918581788896522081643483448259932660433676601769996128318607883861502794659551311565520360939
881806121385586003014356945272242063446317974605946825731037900840244324384656572450144028218852524709
351906209290231364932734975655139587205596542287497740114133469627154228458623773875382304838656889764
619273838149001407673104466402598994902222217659043399018860185665264850617997023561938970178600408118
897299183110211712298459016419210688843871218556461249607987229085192968193723886426148396573822911231
250241866493531439701374285319266498753372189406942814341185201580141233448280150513996942901534830776
445690990731524332782882698646027898643211390835062170950025973898635542771967428222487575867657523442
202075736305694988250879689281627538488633969099598262809561214509948717012445164612603790293091208890
869420285106401821543994571568059418727489980942547421735824010636774045957417851608292301353580818400
969963725242305608559037006242712434169090041536901059339838357779394109700277534720000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
28.04.2003, 13:11 Uhr
virtual
Sexiest Bit alive
(Operator)


Was ist daran kein reines C++? - Dich stört das Include? - das könnte man auch dadurch lösen, daß man bigint einfach eine .h und eine .cpp Datei generieren läßt, mit vollständiger Klassendeklaration/Implementation. Dies séi Dir als Übung überlassen
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
28.04.2003, 14:27 Uhr
~christian
Gast


Hallo zusammen!

Ist sehr schön anzusehen, wie sich dieses Thema entwickelt. Jetzt muss ich mich aber einmal outen, der Begriff Meta-Programming sagt mir nichts, vielleicht kenn ich das unter anderem Namen, aber mit dem Begriff kann ich nichts anfangen.

Wer erklärt mir was es damit auf sich hat? (ausgoogeln konnte ich nix )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: