# Falls mir jemand mit einem Lösungsansatz helfen könnte.



## MarieMS (24. Nov 2004)

Ich muss gerade folgende Aufgabe bearbeiten und hab gerade ein Brett vor´m Kopf.

Falls mir da einer mit einem Lösungsansatz/Vorgehensweise weiterhelfen kann, wäre ich dankbar.

Wie gesagt, ich möchte hier keine Lösungen abschreiben, sondern nur meinen Gedanken auf die Sprünge helfen.

Ja und für viele hier wird diese Aufgabe trivial sein, ich weiss  :wink: 

"Schreiben Sie eine Klasse InterestingNumbers, die die folgenden statischen Methoden enthält:

- die Methode boolean isPrime (long n) überprüft, ob die übergebene Zahl n eine Primzahl ist.

- eine Methode long [] getPrimes (int n), welche ein Array der ersten n Primzahlen zurückgibt. Die erste Primzahl sei dabei 2.

Versehen Sie diese Klasse mit einer Testmethode mit sinnvollen Ausgaben und aussagekräftigen javadoc-Kommentaren."

Danke für evt Tipps.


----------



## foobar (24. Nov 2004)

Benutz mal die Suche hier im Forum, daß wurde schon oft besprochen.


----------



## Guest (24. Nov 2004)

Oh Danke, hätte nicht gedacht, dass sowas so oft auftaucht


----------



## Sky (24. Nov 2004)

http://java-forum.org/de/viewtopic.php?t=10138&highlight=primzahlen

http://www.java-forum.org/de/viewtopic.php?t=9931&postdays=0&postorder=asc&start=0


----------



## MarieMS (24. Nov 2004)

Soweit alles klar, allerdings bekomme ich die Teilaufgabe mit dem Array nicht hin.... :bahnhof:


----------



## L-ectron-X (24. Nov 2004)

Ja, und was speziell nicht? :roll:


----------



## Guest (24. Nov 2004)

Vorallem eben wie ich den Primzahl-Test (also die 1. Methode) jetzt in die Methode getPrimes implementiere/aufrufe.

Und eben wie ich die Ausgabe des Arrays mit den n-Einträgen hinbekomme.

Konnte mich noch nicht so mit Arrays beschäftigen....aber morgen ist Abgabe...aber die Nacht ist ja noch früh  :wink:


----------



## MarieMS (24. Nov 2004)

static boolean isPrime( long n ) { 

        long mod = 1;
        for ( int i = 2, end = (int)Math.sqrt(n); i <= end && mod != 0; i++ ) 
        mod = n % i;
        return ( mod != 0 );
 } 


Das ist mein Primzahlentest


----------



## Wildcard (25. Nov 2004)

Vermute mal du wirst vor der Abgabe noch mal hier rein schaun,
dann kannst du's vergleichen  :wink: 
Hab dein isPrime etwas performanter gemacht:


```
public static boolean isPrime(long n)
    {
        if (n<2)
            return false;
        if (n==2)
            return true;
        if (n%2==0)
            return false;
        
        long end = (long)Math.sqrt(n);
        
        for (int i = 3; i<end;i+=2)
        {
            if (n%i==0)
                return false;
        }
        return true;
    }

    public static long[] getPrimes(int n)
    {
        long [] primes = new long[n];
        int count = 1; 
        int i=3;
        primes[0] = 2;
        
        while (count<n)
        {
            if (isPrime(i))
            {
               
                primes[count] = i;
                count++;
            }
            i+=2;
        }
        return primes;    
    }
```


----------



## MarieMS (25. Nov 2004)

Ich bin froh, wenn meine Lösungen ohne Compiler-Fehler laufen, also auf die Performance  schau ich erst später, wenn ich den Dreh besser raus habe.

Meine Arrayversion lief immer noch nicht. Aber wenn ich Deine Version sehe, sieht alles logisch aus  :idea: 

Ich habe prinzipiell sowieso das Problem aus einer Vorgabe ein laufendes Programm/Methode zu machen. Ich versteh was gemeint ist, aber schaff es nicht, es mir dann in Java zusammenzubasteln bzw den geeigneten Programmablauf zu finden.

Aber wohl das typische Anfängerproblem.

Mal sehen, ob ich jetzt meine Version doch noch ans Laufen bekomme *wo ist mein Kaffee*


----------



## Jaraz (25. Nov 2004)

Hi,

wenns auch noch einigermaßen performant sein soll und mathematisch noch relativ leicht verständlich, suche mal nach dem "Sieb des Eratosthenes".


```
// Eratosthenes.java

import java.io.*;

public class Eratosthenes {
	static PrintWriter out = new PrintWriter(System.out, true);

	static final int n = 10000000;

	static int quadrat = 0, anz = 0;

	static boolean[] Sieb = new boolean[n];

	public static void main(String[] args) {
		for (int i = 0; i < n; i++)
			Sieb[i] = true;
		Sieb[0] = false;
		Sieb[1] = false;
		for (int i = 1; i < n; i++) {
			quadrat = quadrat + 2 * i - 1; // (i+1)*(i+1)=i*i+2*(i+1)-1
			if (quadrat > n)
				break; // Schleifenabbruch wenn i*1>n
			if (Sieb[i])
				for (int j = 2 * i; j < n; j += i)
					Sieb[j] = false;
		} // nun stehen nur noch Primzahlen in der Liste
		for (int i = 0; i < n; i++){
			if (Sieb[i]) {
				out.print(i);
				out.print("\t");
				anz++;
				if (anz == 25) {
					anz = 0;
					out.println();
				}
			}
		}
	}
}
```

Gruß Jaraz


----------



## Bobo (1. Feb 2005)

hey wildcard wie baue ich dein primzahlentest in mein programm ein?

```
import java.io.*;
public class Test
{
	public static void main (String args[])
	throws IOException
	{{
		
double c=1, d=1, e=2, f=2, g;                                              
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Der 'Quadratrest-Generator'! "); 
System.out.println();
System.out.println("Geben Sie eine Primzahl ein"); 
c = Double.parseDouble(br.readLine());                 
double prim1=Math.sqrt(d);
for (e=2; e<prim1; e++)
	{                       
		if (c%e==0)
		{
		System.out.println("Das ist keine Primzahl!");
		System.out.println("Geben Sie eine Primzahl ein"); 
		prim1 = Double.parseDouble(br.readLine());
		}
	}                                                 

System.out.println("Geben Sie eine zweite Primzahl ein!"); 
d = Double.parseDouble(br.readLine()); 
double prim2=Math.sqrt(e);
for (f=2; f<prim2; f++)
	{                       
		if (d%f==0)
		{
		System.out.println("Das ist keine Primzahl!");
		System.out.println("Geben Sie eine Primzahl ein"); 
		prim2 = Double.parseDouble(br.readLine());
		}
	}                                                   
System.out.println("Geben Sie eine Zahl zwischen 2 und "+c*d+" als Startwert ein!"); 
c = Double.parseDouble(br.readLine()); 
                     
while (c<3 || c>(c*d)-1) 
	{ 
	System.out.println("Geben Sie eine Zahl zwischen 2 und "+c*d+" als Startwert ein!"); 
	c = Double.parseDouble(br.readLine()); 
	} 
System.out.println("Geben Sie die Anzahl der Wiederholungen ein!"); 
g = Double.parseDouble(br.readLine()); 
double h;                     
for (h=g; h<0; h-- ) 
	{
	g=g-1; 
	c=c*c; 
	f=(float)(c/(c*d));                     
	}
while (g<1)
{
	System.out.println("Die Zahl muss groesser 0 sein!");
	System.out.println("Geben Sie die Anzahl der Wiederholungen ein!"); 
	g = Double.parseDouble(br.readLine()); 
}	 
System.out.println("Die generierte Zahl lautet: "+f+"."); 
}}}
```


----------



## Wildcard (1. Feb 2005)

[edit by stevg]
 :noe:  Ich zieh das konsequent durch.

Kann doch nicht sein dass man Code kopiert und dann noch gefragt wie man den in sein Programm  einbauen muss.
[/edit]
[edit by Wildcard]
    hast ja recht  :wink: 
[/edit]


----------

