Alle geraden Fibonacci Zahlen summieren
-
SeppJ schrieb:
Für algorithmisch interessierte Leute ohne Deobfuskationskenntnisse: Das was ich da gemacht habe ist ganz einfach eine rekursive Variante von volkards Lösung. Rekursion, weil man sie besonders gut obfuskieren kann. Templatemetaprogrammierung hätte sich zwecks Obfuskation zwar auch angeboten, aber da war Dravere, wenn auch um Leserlichkeit bemüht, leider schneller als ich.
Mir gefallen die Unterstriche!
-
allerdings muss ich sagen, auch wenn es nur spaßeshalber ist,
ist es dennoch eine "outstanding-performance"
(bezüglich der Kreativität, wie Nexus schon ansprach)
überhaupt erst auf solch einen Code zu kommen.
-
Brainfuck
> //push sum=0 >+ //push a=1 >++ //push b=2 >+ //push weiter=true //layout: sum a b (weiter) [ //while weiter [-] //clear weiter < //layout: sum a (b) [->+<<<+>>]>[-<+>]< //sum=sum plus b [->+<]<[->+<]>>[-<+<+>>]< //fibonacci step [->+<]<[->+<]>>[-<+<+>>]< //fibonacci step [->+<]<[->+<]>>[-<+<+>>]< //fibonacci step layout: sum a (b) >++++ push max=4 [->++<]>[-<+++++>]< max=max*10 [->++<]>[-<+++++>]< max=max*10 [->++<]>[-<+++++>]< max=max*10 //paste till 4000000 <[->>+>+<<<]>>>[-<<<+>>>]< //dup 1 //layout: sum a b max (b) [->+<<[->>>]>>-[+<-]<] //while(b){dec b;if(max) dec max;} //hat lange gedauert < // layout: sum a b (b LT max) ] //layout: sum a b false <[-]<[-]< //layout: sum //print multidigit decimal [ //while not zero >++++++++++ //push 10 [->>+>+<<<]>>>[-<<<+>>>]<-<<<[>>>[->+>+<<]>>[-<<+>>]+<[[-]>-<]>[-<+>]<[[-]<<+<[->>+>+<<<]>>>[-<<<+>>>]]<-<<<-]>>[-<<+>>]>[-<<->>]<<- //divmod + //inc for finding end of number //sentinel is zero [->+<]<[->+<]>>[-<<+>>]< //swap ] < //go back [ //while not zero - //dec >+++[->++++<]>[-<++++>]<[-<+>]<.[-]< //write digit ]
Als Interpretrer eignet sich der da http://esoteric.sange.fi/brainfuck/impl/interp/i.html mit large variables.
-
zB so:
/* * Fibonacci.h * * Created on: 13.04.2010 * Author: dit */ #ifndef FIBONACCI_H_ #define FIBONACCI_H_ #include <iostream> class Fibonacci { private: static const long MAX = 30; long* array; long getFibonacci(long a); public: Fibonacci(); virtual ~Fibonacci(); long getSum(); }; #endif /* FIBONACCI_H_ */
Implementierung:
/* * Fibonacci.cpp * * Created on: 13.04.2010 * Author: dit */ #include "Fibonacci.h" using namespace std; Fibonacci::Fibonacci() { //array mit "-1" initialisieren. this->array = new long[this->MAX]; for (long i = 0; i < this->MAX; i++) { this->array[i] = -1; } } Fibonacci::~Fibonacci() { delete[] this->array; } /** * Berechnet FibonacciZahl rekursiv aus. */ long Fibonacci::getFibonacci(long a) { // wurde schon ausgerechnet? if(this->array[a] != -1){ return this->array[a]; } if (a == 1 || a == 2) { return 1; } else { return getFibonacci(a - 1) + getFibonacci(a - 2); } } /** * Berechnet Summe aller nicht geraden FibonacciZahlen. */ long Fibonacci::getSum() { long sum = 0; for(long i = 1; i < this->MAX; i++){ long t = getFibonacci(i); //ergebnis abspeichern this->array[i] = t; //pruefe ob gerade ist oder nicht if((t % 2) != 0){ sum += t; } //cout << "fib( "<< i << " ) = " << t << endl; } return sum; }
P.S.
Axoo, geraden wurden gefragt... ehmmm verdammt... alles umsonst...
-
Mach es in Brainfuck2D, sieht besser aus.
-
Fellhuhn schrieb:
Mach es in Brainfuck2D, sieht besser aus.
Keine Herausforderung. Es dann mit Brainfuck2D für Fachfremde hübsch aussehen zu lassen, kann ja ein Webdesigner machen.
-
Piet!
-
Frage. Warum nicht so?
int f1 = 0; int f2 = 1; int f3 = 0; for( int x = 0; f3 <= 4000000; x++) { cout << f3 << endl; f1 = f2; f2 = f3; f3 = f2 + f1; }
-
Und wo ist die Summe und wo alle geraden Zahlen? Da fehlt noch einiges.
-
#include <iostream> int main(){std::size_t b,s,f,a=s=b=(int)NULL+1;a=f=--s;while((f=a+b)<-1+4e6+((s+=f%2?(int)NULL:f,a=b,b=f)/1))a=b,b=f;std::cout<<s;}
-
Oops, so wars gedacht:
#include <iostream> int main(){std::size_t b,s,f,a=s=b=(int)NULL+1;a=f=--s;while((f=a+b)<-1+4e6+((s+=f%2?(int)NULL:f)/1))a=b,b=f;std::cout<<s;}
-
ssdfsdf schrieb:
(int)NULL+1
Schlaue und kreative obfuscation ist was schönes, aber das ist doch einfach nur dämlich.
-
Nukularfüsiker schrieb:
ssdfsdf schrieb:
(int)NULL+1
Schlaue und kreative obfuscation ist was schönes, aber das ist doch einfach nur dämlich.
Hat einfach den Sinn, dass man nicht weiß wie NULL auf dem Compiler definiert ist. Ersetz es eben durch 1e0
-
habs noch etwas abgewandelt:
#include <iostream> int main(){std::size_t b,s,f,a=s=b=1e3/1e2/1e1;for(a=f=(--s);(f=-(-a-b))<-1+4e6+((s+=f%2?0e0:f)/1);a=b,b=f);std::cout<<s;}
-
So fertig.
#include <iostream> int main(){std::size_t _e0,_$,_o_,_0xFF=_e0=_$=1e3/1e2/1e1;for(_0xFF=_o_=(--_e0);(_o_=(0e0-1)*(-_0xFF-_$))<-1+4e6+((_e0+=_o_%2?0x0&0xFF:_o_)/1);_0xFF=_$,_$=_o_);std::cout<<_e0;}
-
Sorry, hab die Aufgabe nur halb gelesen...
Aber so...????
int f1 = 0; int f2 = 1; int f3 = 0; for( int x = 0; f3 <= 4000000; x++) { if(!(f3 % 2)) { cout << f3 << endl; } f1 = f2; f2 = f3; f3 = f2 + f1; }
-
Man sieht das du die Aufgabenstellung nur halb gelesen hast. Versuch es noch ein Mal.
-
Omega_ schrieb:
Man sieht das du die Aufgabenstellung nur halb gelesen hast. Versuch es noch ein Mal.
Ja stimmt, hast recht
-
Aber jetzt...
Das war Step by Step
int f1 = 0, f2 = 1, f3 = 0, summe = 0; for( int x = 0; f3 <= 4000000; x++) { if(!(f3 % 2)) { summe += f3; } f1 = f2; f2 = f3; f3 = f2 + f1; } cout << summe << endl;
-
Sieht nicht verkehrt aus, obwohl ich f3 % 2 == 0 bevorzugen würde.
Jetzt kannst du dein Ergebnis mit der auf Seite 3 genannten Lösung vergleichen und siehst, ob du richtig liegst.
Oder Schritt für Schritt nachrechnen.