# Prim- und Fibonaccizahlen



## blubbs (17. Nov 2010)

Hey,

ich hab schon gesehen dass Primzahlen wohl sehr begehrte Aufgaben sind von Informatiklehrern, aber ich komm mit den bisherigen Beiträgen trotzdem nicht weiter. Auch irgendwelche Struktogramme oder andere Ansätze waren nicht hilfreich (zumindest nicht für mich).

also wir sollen bei einer Zahl sagen, ob die Zahl eine Primzahl bzw. eine Fibonaccizahl ist.

das ist bereits vorgegeben und kann/darf auch nicht geändert werden:


```
public class ZahlenTest {
   private int n;
   public ZahlenTest(int value){
       n = value;
   }
   public boolean istFibonacci() {
      // hier Quelltext einfügen
   }

   public boolean istPrimzahl() {
       // hier Quelltext einfügen
   }
}
```

das ist meine Primzahlmethode (ich weiß, sie ist sicher furchtbar umständlich, aber nur so hab ich es einigermaßen verstanden ), leider funktioniert sie nicht. es werden schon einmal alle durch 2 teilbaren Zahlen ausgeschlossen, dafür werden aber auch alle ungeraden als Primzahl verkauft


```
public boolean istPrimzahl() 
  {
      boolean value = true;
      int teiler = 0;
      
      if (n <= 1)
      {
       System.out.println("Primzahlberechnung nicht möglich.");
       value = false;
      }
      else
      {
        if (n == 2)
        {
          value = true;
        }
        else
        {
          if ((n%2) == 0) //wenn n durch 2 teilbar -> keine Primzahl
          {
              value = false;
          }
          else
          {
            for (teiler = 1; teiler <= n-1; teiler++)
            {
             if ((n % teiler == 0) && (n / teiler != n)) //wenn Rest von n/teiler = 0 und n/teiler ist nicht n, dann keine Primzahl
             {       
               value = false;
             }
             else  //wenn Rest von n/teiler nicht Null und n/ teiler gleich n, dann Primzahl
             {
               value = true;
             }
            }   
          }
        } 
      }
      return value; 
   }
```



und das ist die Fibonaccimethode. die funktioniert auch nicht. da öffnet bluej (müssen wir an der uni verwenden) gar nichts und es rechnet die ganze zeit nur.


```
public boolean istFibonacci() 
  {   
    boolean value;          
     if ((n == 0) | (n == 1))
      value = true;
     else
      { 
     
     for (n = 2; n <= n; n++)
     {
      if (n == (n - 1) + (n - 2))
      {
        value = true;
      }   
      else
        value = false;
    }   
   }
   return value;
  }
```


also ich weiß, für euch sicher einfach und schon hundert mal gestellt, aber vll könnt ihr mir ja trotzdem helfen =) danke euch.

lg blubbs


----------



## Michael... (17. Nov 2010)

zu Primzahl:
lass die for-Schleife mit teiler = 2 loslaufen.
und prüfen nur
	
	
	
	





```
if (n % teiler == 0)
```
 n/teiler==n kann nur für teiler=1 eintreten
wenn die Bedingung erfüllt ist musst Du aus der Schleife raus, z.B per 
	
	
	
	





```
return false;
```
Die Variable value brauchst eigentlich gar nicht, da die Methode direkt per return boolean beendet werden kann.

zu Fibanocci:
Du hast eine Endlosschleife da n immer <= n ist
Die Überprüfung würde ich mir auch nochmal anschauen.


----------



## XHelp (17. Nov 2010)

Zu den Primzahlen: du darfst in der Schleife das value nicht auf true setzen. Es steht VOR der Schleife auf true und wir in der Schleife höhstens auf false gesetzt. Der Aufgabe ist aber wirklich extrem komisch und mit sicherheit auch nicht leichter verständlich

Zu den Fibonaci-Zahlen:
[JAVA=9]
for (n = 2; n <= n; n++)
[/code]
Was soll die die 
	
	
	
	





```
n<=n
```
 Überprüfung bringen, wann kann denn eine Zahl NICHT gleich sich selbst sein? _(keine Quizfrage, ich weiß, dass es möglich ist)_


----------



## blubbs (17. Nov 2010)

zu den Primzahlen:

danke für die antworten, das funktioniert mittlerweile =) obwohl ich value jetzt drin gelassen habe, weil ich nicht wusste, wie man boolean zurückgeben kann (bei einfach return oder return boolean kommt immer ne fehlermeldung, aber es funktioniert und das lass ich mir mal von meiner lehrerin erklären =) )

zu Fibonacci:

ich wusste bei der for schleife nicht, wie ich das angeben soll, wie lang die laufen soll. weil theoretisch soll die doch bis zur zahl n laufen...wenn ich aber n=n eingebe dann kommt: "incompatible types - found int but expected boolean"...also sicherlich hab ich da einen denkfehler, aber für mich war das da irgendwie logisch


----------



## Michael... (17. Nov 2010)

```
public boolean istPrimzahl() {  
      if (n <= 1) {
          System.out.println("Primzahlberechnung nicht möglich.");
          return false;
      }
      else {
          if (n == 2)
             return true;

         for (int teiler = 2; teiler < n; teiler++) {
             if (n % teiler == 0)
                 return false;
         }
      }
      return true; 
}
```
Wobei man die for-Schleife auch kürzer laufen lassen könnte.


----------



## blubbs (17. Nov 2010)

ok, das sieht natürlich wesentlich einfacher aus als bei mir  danke dir! 

aber eins versteh ich nicht: mal angenommen n = 9 und teiler = 2. dann kommt bleibt ja als rest 1 übrig...trotzdem wird 9 nicht als Primzahl erkannt. wo ist das denn jetzt im Programm ablesbar?


----------



## Michael... (17. Nov 2010)

teiler wird bei n = 9 irgendwann auch mal 3


----------



## Andi_CH (18. Nov 2010)

Michael... hat gesagt.:


> zu Primzahl:
> wenn die Bedingung erfüllt ist musst Du aus der Schleife raus, z.B per
> 
> 
> ...



Dieses Verfahren ist aber nicht überall beliebt. Es gibt sogar Projekte in denen es verboten ist mehr als ein return-Statement zu haben (vielleicht ein wenig stur, aber was solls, guidelines sind nun mal einzuhalten - es ist oft auch ein Tabuthema Schleifen abzubrechen, was nicht immer zu elegantem Code führt - ein break kann eleganter sein ;-) )
Spätestens wenn eine Funktion 100 Zeilen Code und 10 "return" statements hat, wird es unübersichtlich.
Es ist also nicht besonder schlimm einen value zu setzten, den vernünftig zu initialisieren und am Schluss zurück zu geben ...


----------



## Landei (18. Nov 2010)

Eher nicht das, worauf deine Leerkraft hinaus wollte, aber trotzdem lustig:


```
import static java.lang.Math.*;

    public static boolean isFibo(int f) {
        if (f < 0) return false;
        if (f < 4) return true;
        int n = (int) round(log(f*sqrt(5))/log(0.5*(1+sqrt(5))));
        return (int) round(pow(0.5*(1+sqrt(5)),n)/sqrt(5)) == f;
    }
```

Die Funktion nutzt eine von der Formel von Moivre-Binet abgeleitete Nährung: Zuerst wird zu einem vermeintlichen fibo(n) das n bestimmt, und dann "zurückgerechnet", ob man wieder zum gleichen Wert kommt.


----------



## blubbs (18. Nov 2010)

Hey,

vielen dank schon mal für die vielen Vorschläge! Die Primzahlen laufen =)

ich hab immernoch meine Probleme bei den Fibonaccizahlen

ich habe bis jetzt:


```
public boolean istFibonacci() 
  {    
   boolean value = true;
      int x = 0;
   if (n <= 3)
     value = true;
   else
   { 
     
     for (x = 4; x <= n; x++)
     {
       if (n == (n - 1) + (n - 2))
       {
          value = true;
          return true;
       }   
       else
         value = false;
     }   
   }
   return value;
  }
```

aber es gibt nicht die richtigen werte an. ich schätze mal es liegt an der if-anweisung in der for-schleife, oder? aber wir hatten in der Aufgabe auch "Fibonacci-Zahlen sind Bestandteile einer Zahlenfolge, bei der jede Zahl gleich der Summe der vorhergehenden zwei Zahlen ist. Fi = Fi-1 + Fi-2" stehen...oder ist der Fehler doch an einer ganz anderen stelle? was denkt ihr?


----------



## Marcinek (18. Nov 2010)

Ich würde dir vorschlagen debugausgaben einzubauen.

n ändert sich in der schleife nie.

und hängt auch nicht von x ab, also ist das 1.Ergebnis deiner schleife auch das 2. und x. Ergebnis


Noch was:

Du willst testen, ob 13 eine fib ist.

Wie gehst du vor? 

Laut deinem Program: 13 == 13- 1 + 13- 2 (=23) und das testest du 13-4 mal in deiner forschleife.

Ich könnte beweisen, dass sich das ergebnis nie ändert.

Werden so Fibzahlen berechnet? - Wenn du das rekursiv machen würdest, dann sicher.

Aber sonst musst du doch immer 1 + 1 = 2; 1+2=3 ; 2+3=5; 3+5=8; 5+8 = 13


----------



## bone2 (18. Nov 2010)

warum hast du zum überprüfen einer einzelnen zahl überhaupt ne schleife?


----------



## Landei (18. Nov 2010)

Der Trick bei Fibo ist, zwei Werte mitzuführen:


```
public static boolean isFibo(int f) {
        if (f < 0) return false;
        int a = 1;
        int b = 0;
        while(b < f) {
            int temp = b;
            b += a;
            a = temp;
        }
        return b == f;
    }
```


----------



## blubbs (18. Nov 2010)

@Marcinek: die überlegung hatte ich auch schon, dass das rechnerisch irgendwie nicht so sinnvoll ist, aber eine andere Lösung hatte ich auch nicht. hab versucht, mich an der aufgabenstellung entlang zuhangeln.

@ Landei: vielen, vielen Dank für die Hilfe, hätte das alleine sicher nicht hinbekommen =) 

also es läuft jetzt! plus: ich hab es sogar verstanden =) bis auf die Stelle: "return b == f;" warum kann ich das da hinschreiben, obwohl im methodenkopf boolean steht? also es geht ja, aber ich versteh nicht warum?!


----------



## Michael... (18. Nov 2010)

blubbs hat gesagt.:


> also es läuft jetzt! plus: ich hab es sogar verstanden =) bis auf die Stelle: "return b == f;" warum kann ich das da hinschreiben, obwohl im methodenkopf boolean steht? also es geht ja, aber ich versteh nicht warum?!


Weil das ein boolean ist bzw. diese Operation einen boolean liefert.


----------



## bone2 (18. Nov 2010)

return b == f; gibt das ergebnis des vergleiches von b und f zurück, also ein boolean

wie

```
if (b == f) {return true} else {return false}
```


----------



## blubbs (18. Nov 2010)

aah ok, klingt logisch. vielen lieben Dank noch mal für die Hilfe! =)


----------

