Alle geraden Fibonacci Zahlen summieren


  • Administrator

    skullyan schrieb:

    1089154 ist mein Ergebnis. Stimmt das?

    Meine Lösung und die von Werner ergeben 4613732. 😉

    Grüssli



  • Dravere schrieb:

    skullyan schrieb:

    1089154 ist mein Ergebnis. Stimmt das?

    Meine Lösung und die von Werner ergeben 4613732. 😉

    Grüssli

    👍



  • skullyan schrieb:

    Dravere schrieb:

    skullyan schrieb:

    1089154 ist mein Ergebnis. Stimmt das?

    Meine Lösung und die von Werner ergeben 4613732. 😉

    Grüssli

    👍

    Jetzt hast du das Ergebnis, aber den Weg nicht... hat's sich für dich gelohnt? 🙄



  • gelöscht



  • Da keine explizite Programmiersprache angegeben ist, und es bestimmt nur zufaellig in das C++-Forum gerutscht ist, poste ich mal meine Loesung in Haskell:

    fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
    main = do putStrLn $ show $ sum $ takeWhile (<4000000) $ filter even fibs
    


  • Und gerade wollte ich fragen, wo knivil mit seinem Haskell-Einzeiler bleibt.



  • Hach, sowas wollte ich schon immer mal schreiben. (riecht fast ein wenig undefiniert?)

    #include <iostream>
    int main(){int a=1,b=2,s=2;while((b=(a+=b*2)*2-b)<4e6)s+=b;std::cout<<s;}
    

  • Mod

    volkard schrieb:

    Hach, sowas wollte ich schon immer mal schreiben. (riecht fast ein wenig undefiniert?)

    #include <iostream>
    int main(){int a=1,b=2,s=2;while((b=(a+=b*2)*2-b)<4e6)s+=b;std::cout<<s;}
    

    Ich seh nichts undefiniertes.



  • @Dravere, knivil, volkard 👍

    volkard Du inspirierst mich. Als Freund und Förderer der for-Schleife würde ich schreiben:

    #include <iostream>
    #include <algorithm> // std::swap
    
    int main()
    {
        int sum = 0;
        for( int prev_even = 0, fibo_even = 2; fibo_even < 4E6; std::swap( prev_even += 4*fibo_even, fibo_even ) )
            sum += fibo_even;
        std::cout << sum << std::endl;
    }
    

    Gruß
    Werner


  • Mod

    Hier dann noch eine für die Sprache C typische Version 🤡 :

    #include <stdio.h>
    
    I_I(_, _0_, __,_3)??<return((_=(_0_+=_*_3)*_3-_)<4e6)?I_I(_,_0_,__+=_,_3):__;??>main(_)??<printf("%i",I_I(_+_,_,_+_,_+_));??>
    


  • *hust* da bekommt man ja Angst 😮



  • Dweb schrieb:

    *hust* da bekommt man ja Angst 😮

    Das ist ja auch so gedacht. 😉



  • Also ich mag solche Threads, und noch mehr die kreativen Vorschläge. 👍

    Da hats ja wirklich für jeden was dabei. 🙂



  • Nexus schrieb:

    Da hats ja wirklich für jeden was dabei. 🙂

    Draveres Version ist mein Favorit 😃
    (Nexus du kommst nicht zufälligerweise ausm Süden? "Da hats" statt "da gibts" kenn ich bisher nur ausm allemannischen Sprachraum...)



  • pumuckl schrieb:

    Draveres Version ist mein Favorit 😃

    Ja, die passt richtig zu ihm. Er als Metaprogrammierung-Liebhaber... 🙂
    Überhaupt kommen mir die Codes recht persönlich vor.

    pumuckl schrieb:

    (Nexus du kommst nicht zufälligerweise ausm Süden? "Da hats" statt "da gibts" kenn ich bisher nur ausm allemannischen Sprachraum...)

    Doch, sehr südlich sogar. Ich bin Schweizer. 😉


  • Mod

    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.



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


Anmelden zum Antworten