Fibonacci overflow integer

Daelerion

Mitglied
Hey Leute 🙂

Meine Aufgabe ist es die n-te Stelle der Fibonacci Zahl zurückzugeben. Und das mit einem normalen Integer.

Wenn der Integer overflowt dann soll ich lediglich "-1" zurückgeben.


Mein bisheriger Code ist
Code:
public int fibonacci(int n) {
        
        int fib1 = 0;
        int fib2 = 1;
        int fib3 = 0;
        
        
            
        for (int i=1; i<n ; i++) {
            fib3=fib1 + fib2;
            fib1 = fib2;
            fib2 = fib3;
            
            if (fib2 > Integer.MAX_VALUE){
                fib2 = -1;
                break;
                
                
            }
            
          
        }
         return fib2;
        }

grade testet es mit mehreren Variablen durch und mir wird gesagt,
wenn ein zu hoher n-Wert angegeben wird und der Int overflowt dann wird keine(!) "-1"! zurückgegeben.
Was übersehe ich denn ?
 
Ein Integer kann nie größer sein als Integer.MAX_VALUE.

Was kommt denn raus, wenn Du fib3=fib1 + fib2; rechnest und es zu dem Overflow kommt?

Was für einen Wert hat fib3 beim Overflow?

Edit: Prüf doch sonst einfach einmal, was int test = Integer.MAX_VALUE + 1; ergibt. Dann musst Du nicht den Overflow ausprobieren bei Deinem Code....
 
Edit: Prüf doch sonst einfach einmal, was int test = Integer.MAX_VALUE + 1; ergibt. Dann musst Du nicht den Overflow ausprobieren bei Deinem Code....
Oh. Ja du hast Recht, bin ich doof. MAX + 1 = MIN value. Okay gut habe es gelöst indem ich die fib zu long gemacht habe :
Code:
public int fibonacci(int n) {
        
        long fib1 = 0;
        long fib2 = 1;
        long fib3 = 0;
        
        
        
            
        for (int i=1; i<n ; i++) {
            fib3=fib1 + fib2;
            fib1 = fib2;
            fib2 = fib3;
            
            if (fib2 > Integer.MAX_VALUE){
                fib2 = -1;
                break;
                
                
            }
            
          
        }
        int erg = (int)fib2;
         return erg;
        }
        
        
      
        
        
    }



Somit habe ich einen Int als Ausgabe, was Teild er Aufgabe ist, das hat mich whol zu sehr beschäftigt, dass ich nicht daran gedacht habe ein long zu nehmen um den Wert zu errechnen.
Danke dir !
 
Wenn du die fib(n) mit fib(n+1) vergleichst: was kannst du dann sagen bezüglich der Größe? Was gilt da?

Und gilt das auch, wenn es zu dem Überlauf gekommen ist?
 
Oh also könnte ich theoretisch einfach prüfen, ob der int negativ ist, also
Code:
if (fib2 < 0){
fib2=-1;

}

Da ja wenn er overflowt ins negative geht. Somit brauche ich dort kein long
 
Code:
 public int fibonacci(int n) {
        
        int fib1 = 0;
        int fib2 = 1;
        int fib3 = 0;
        
        
        
            
        for (int i=1; i<n ; i++) {
            fib3=fib1 + fib2;
            fib1 = fib2;
            fib2 = fib3;
            
            if (fib2 < 0){
                fib2 = -1;
                break;
                
                
            }
            
          
        }
        
         return fib2;
        }



Ist somit mein Endergebnis, ohne loong zu verwenden 🙂
Danke für die Hinweise
 

Zurück
Oben