# Primzahltest



## paco89 (17. Dez 2011)

hallo, ich hatte folgende aufgabe:

Eine Primzahl ist eine Zahl, die nur durch 1 und sich selbst teilbar ist.

1)Schreibe eine Funktion boolean isPrime(int n), die für eine gegebene, positive ganze Zahl n>=2 feststellt, ob diese Zahl eine Primzahl ist oder nicht.
2)Rufe die Funktion mit ein paar Testwerten auf und gib auf dem Bildschirm eine Meldung wie "... ist Primzahl" bzw. "... ist keine Primzahl" aus.
3)Benutze die Funktion isPrime(), um die ersten 100 Primzahlen auszugeben.



den ersten Teil habe ich mit folgendem code gelöst:


```
public class Primzahlen
{ 
  static boolean isPrime(int n)
  {
      int zaehler = 2;
      boolean value = true;
      
      while(zaehler < n)
      {
        if( (n%zaehler)==0 )
        {
          value=false;
        }
          zaehler++;
      
      }
     
      return value;
      
      
  }

    public static void main(String[] args)
    { 
      System.out.println("Bitte geben Sie eine Zahl ein: ");
      int a = Integer.parseInt(System.console().readLine());
      System.out.println(isPrime(a));
      
      
    }
 }
```

für die zweite teilaufgabe habe ich den code geändert zu:


```
public class Primzahlen
{ 
  static boolean isPrime(int n)
  {
      int zaehler = 2;
      boolean value = true;
      
      while(zaehler < n)
      {
        if( (n%zaehler)==0 )
        {
          value=false;
        }
          zaehler++;
      
      }
     
      return value;
      
      if (value == true)
        System.out.println("Die eingegebene Zahl ist eine Primzahl");
        
      else
        System.out.println("Die eingegebene Zahl ist keine Primzahl");
        
      
      
  }
  
 
     public static void main(String[] args)
    { 
      System.out.println("Bitte geben Sie eine Zahl ein: ");
      int a = Integer.parseInt(System.console().readLine());
      System.out.println(isPrime(a));
      
      
    }
 }
```

der erste code kompiliert aber der zweite nicht. in zeile 20 soll ein "unreacheable statement" sein...und in zeile 28 ein "missing return statement".

wie kann man das verbessern....;(



edit: an der dritten aufgabe arbeite ich noch....


----------



## Marcinek (17. Dez 2011)

Wenn du nach
	
	
	
	





```
return value;
```
 code stehen hast, dann ist dieser unereichbar.


----------



## Fab1 (17. Dez 2011)

paco89 hat gesagt.:


> in zeile 20 soll ein "unreacheable statement" sein
> 
> und in zeile 28 ein "missing return statement".



unreacheable statement tritt auf, daher nach dem return value; die Methode beendet ist und somit die If-Anweisung nie aufgerufen wird.

In Zeile 28 steht bei mir kein Code 

Hier mein Ansatz für dein Problem:


 Die Abfrage der Zahl hab ich ein bisschen abgeändert, bei mir kam immer ne NullPointerException, wusste nicht wirklich was deine macht bzw. braucht.


```
import java.util.Scanner;

public class Test
{ 
  static boolean isPrime(int n)
  {
      int zaehler = 2;
      boolean value = true;
      
      while(zaehler < n)
      {
        if( (n%zaehler)==0 )
        {
          value=false;
        }
          zaehler++;
      
      }
     
      return value;
       
  }
  
     public static void main(String[] args)
    { 
      System.out.println("Bitte geben Sie eine Zahl ein: ");
      Scanner sc = new Scanner(System.in);
      int a = sc.nextInt();
     // System.out.println(isPrime(a));
      
      if (isPrime(a)){
    	  System.out.println("Die eingegebene Zahl ist eine Primzahl");
      }
             
        else{
        	 System.out.println("Die eingegebene Zahl ist keine Primzahl");
        }
    }
 }
```

Marcinek war mal wieder schneller, naja egal


----------



## paco89 (18. Dez 2011)

ah okay, dass mit dem return merke ich mir.


vielen dank...

ich mach mich mal jetzt an die teilaufgabe 3 heran..,


edit: ich habe leider zu der 3. teilaufgabe gar keinen ansatz. ich habe mir überlegt, eine schleife zu benutzen und sie mit der neuen methode isPrime() zu kombinieren, die die vorherige methode istPrime (int n) rekursiv aufruft. ich weiß aber nicht wie ich das implementieren kann....


also ich meinte sowas hier:


```
public class Primzahlen
{ 
  static boolean isPrime(int n)
  {
      int zaehler = 2;
      boolean value = true;
      
      while(zaehler < n)
      {
        if( (n%zaehler)==0 )
        {
          value=false;
        }
          zaehler++;
      
      }
     
      return value;
      
      
  }
  static int isPrime()
  {
    for(int zaehler = 0; zaehler<1000; zaehler++)
    {
      isPrime(zaehler);
      
      if(isPrime(zaehler))
        System.out.println(zaehler);
    }
    return isPrime();
  }
    
    public static void main(String[] args)
    { 
      System.out.println("Bitte geben Sie eine Zahl ein: ");
      int a = Integer.parseInt(System.console().readLine());
      System.out.println(isPrime(a));
      
      if(isPrime(a))
        {
          System.out.println("Die eingegebene Zahl ist eine Primzahl.");
        }
        
      else  
        System.out.println("Die eingegebene Zahl ist eine Primzahl.");
        
    isPrime();
        
    }
 
 }
```


ich weiß dass der code nicht kompiliert, aber was besseres ist mir im moment nicht eingefallen


----------



## yyannekk (18. Dez 2011)

> 3)Benutze die Funktion isPrime(), um die ersten 100 Primzahlen auszugeben.



Ich vermute du sollst hier nicht noch eine Funktion isPrime() erzeugen sondern die bereits vorhandene
isPrime(int) verwenden um die Primzahlen zwischen 1 und 100 zu ermitteln.
Also im Prinziep nur das was du in isPrime() machst...


----------



## Kiri (18. Dez 2011)

Aufgabe 3 könnte ganz einfach so aussehen. Vorausgesetzt isPrime() funktioniert - ich habe es mir nicht angeschaut.


```
public static void aufgabe3()
{
    for(int i = 1; i <= 100; i+=2)
    {
        if(isPrime(i))
        {
            System.out.println(i);
        }
    }
}
```


----------



## irgendjemand (18. Dez 2011)

um vllt noch einen mathematischen hintergrund einzuwerfen

es reicht wenn man nur 2 bis wurzel(n) berechnet anstatt 2 bis n ... *steht auch bei wikipedia*
auch ist deine mathematische definition der primzahl nicht ganz korrekt ...

eine primzahl ist eine zahl die sich nur durch 1 und sich selbst OHNE REST teilen lässt ... mit rest kannst du alle zahlen durch alle teilen ...


```
static int isPrime()
  {
    for(int zaehler = 0; zaehler<1000; zaehler++)
    {
      isPrime(zaehler);
      
      if(isPrime(zaehler))
        System.out.println(zaehler);
    }
    return isPrime();
  }
```
sorry ... aber was soll das denn ?
erst rufst du "isPrime(int)" auf ... speicherst den returnten bool aber nirgends und callst dann "isPrime(int)" innerhalb des if() ein zweites mal ?
das ist sehr unperformant ...

entweder du callst die methode dierekt im if() EINMAL ...
oder außerhalb davon und speicherst den return-wert irgendwo ... aber eine methode ZWEI MAL dierekt hinter ein ander callen kann bei komplexeren dingen sehr schnell zu schweren fehlern führen

also entweder

```
static int isPrime()
  {
    for(int zaehler = 0; zaehler<1000; zaehler++)
    {
      if(isPrime(zaehler))
        System.out.println(zaehler);
    }
    return isPrime();
  }
```
oder

```
static int isPrime()
  {
    for(int zaehler = 0; zaehler<1000; zaehler++)
    {
      boolean prime=isPrime(zaehler);
      
      if(prime)
        System.out.println(zaehler);
    }
    return isPrime();
  }
```

aber das was du da gemacht hast führt spätestens bei network-i/o , stacks oder vergleichbarem sofort beim ersten call zu fehlern ...


----------



## Kiri (18. Dez 2011)

Editieren nicht mehr möglich, deshalb verbesser ich mich hier selbst. Die for-Schleife muss wie folgt aussehen, bei der vorherigen hatte ich die Ziffer 2 vergessen!



Kiri hat gesagt.:


> Aufgabe 3 könnte ganz einfach so aussehen. Vorausgesetzt isPrime() funktioniert - ich habe es mir nicht angeschaut.
> 
> 
> ```
> ...


----------

