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. |