Prim- und Fibonaccizahlen

blubbs

Mitglied
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:

Java:
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 :D), leider funktioniert sie nicht. es werden schon einmal alle durch 2 teilbaren Zahlen ausgeschlossen, dafür werden aber auch alle ungeraden als Primzahl verkauft

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

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

Top Contributor
zu Primzahl:
lass die for-Schleife mit teiler = 2 loslaufen.
und prüfen nur
Code:
 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
Code:
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

Top Contributor
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
Code:
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

Mitglied
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 :D
 

Michael...

Top Contributor
Java:
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

Mitglied
ok, das sieht natürlich wesentlich einfacher aus als bei mir :D 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?
 

Andi_CH

Top Contributor
zu Primzahl:
wenn die Bedingung erfüllt ist musst Du aus der Schleife raus, z.B per
Code:
return false;
Die Variable value brauchst eigentlich gar nicht, da die Methode direkt per return boolean beendet werden kann.

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 ...
 
Zuletzt bearbeitet:

Landei

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

Java:
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

Mitglied
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:

Java:
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?
 
M

Marcinek

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

Landei

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

Java:
    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

Mitglied
@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?!
 
B

bone2

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

wie
Java:
if (b == f) {return true} else {return false}
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben