Problem mit for-Schleife bei der Primzahlberechnung

Status
Nicht offen für weitere Antworten.

ChackZz

Mitglied
Hallo, ich wollte einen kleinen Benchmark selbst in Java schreiben und mal gucken, inwiefern ich das hinkriege. Mit Hilfe eines Buches und Vorlesungsskriptes bin ich nun auch "relativ" weit. Aber ich komm an einer Stelle einfach nicht auf den Fehler:
Code:
/**
 * @(#)JavaPrimeBench.java
 *
 *
 * @author 
 * @version 0.1 2007/10/29
 */

import java.io.*;

public class JavaPrimeBench {
	public static void main(String[] args) 
	throws IOException
	{
		int a; // Startzahl
		int b; // Endzahl
		long startZeit; //Startzeit
		long endZeit; //Endzeit
		
		BufferedReader din = new BufferedReader(
							 new InputStreamReader(System.in));
							 
	System.out.println("Startzahl eingeben (Standard = 0):");
	a = Integer.parseInt(din.readLine()); // a=Eingabe des Benutzers
	System.out.println("Bitte Endzahl geben:");
	b = Integer.parseInt(din.readLine()); // b=Eingabe des Benutzers
	startZeit = System.currentTimeMillis(); //Startzeit speichern
	for (a <= b; a++;) {
		 int anzahlTeiler = 0; // Anzahl der Teiler auf 0 setzen
	   	 for (int teiler = 1; teiler <= a; teiler++) { // Anzahl der Teiler ermitteln
                if (al % teiler == 0) {
                    anzahlTeiler++;
                }
            }
			if (anzahlTeiler == 2) { // Zahl ausgeben, wenn sie genau zwei Teiler hat (eine Primzahl ist)
                System.out.println(a);
            }
        }
    endZeit = System.currentTimeMillis(); //Endzeit speichern
    long nettoZeit;
    nettoZeit = (startZeit-endZeit); //Endzeit von der Startzeit subtrahieren um Laufzeit herauszufinden
   	System.out.println(nettoZeit); //Laufzeit ausgeben
    }
	}

Die Zeile 28 gibt beim Compilieren immer die Fehlermeldung "not a Statement" und ich komm einfacn nicht darauf, warum. Sichtbarkeitsproblem vielleicht? Oder muss das int da rein? (Dann hab ich jedoch Probleme die Benutzereingabe zu realisieren^^) Ansonsten bitte ich die anderen Fehler die sich drin sind, erstmal zu ignorieren, will mich da dann erst selbst reinfummeln 🙂

Danke
 
Das for-Konstrukt von dir funktioniert so nicht!

ForStatement
for ( [ Initialization ] ; [ Expression ] ; [ Update ] ) Statement


oder eben seit 1.5 die iteration über Arrays oder listen.
 
Ich hab jetzt mal die Variable nicht direkt initialisiert sondern eben erst im for.
Dadurch fehlt mir zwar die Benutzereingabe, aber Standard sollte ja eh 0 sein.
Code:
/**
 * @(#)JavaPrimeBench.java
 *
 *
 * @author 
 * @version 0.1 2007/10/29
 */

import java.io.*;

public class JavaPrimeBench {
	public static void main(String[] args) 
	throws IOException
	{
//		int a; // Startzahl
		int b; // Endzahl
		long startZeit; //Startzeit
		long endZeit; //Endzeit
		
		BufferedReader din = new BufferedReader(
							 new InputStreamReader(System.in));
							 
//	System.out.println("Startzahl eingeben (Standard = 0):");
//	a = Integer.parseInt(din.readLine()); // a=Eingabe des Benutzers
	System.out.println("Bitte Endzahl geben: (Das Programm errechnet alle Primzahlen von 0 bis zu ihrer Eingabe, mit Ausnahme der 1)");
	b = Integer.parseInt(din.readLine()); // b=Eingabe des Benutzers
	startZeit = System.currentTimeMillis(); //Startzeit speichern
	for (int a=2; a <= b; a++) { 
		 int anzahlTeiler = 0; // Anzahl der Teiler auf 0 setzen
	   	 for (int teiler = 1; teiler <= a; teiler++) { // Anzahl der Teiler ermitteln
                if (a % teiler == 0) {
                    anzahlTeiler++;
                }
            }
			if (anzahlTeiler == 2) { // Zahl ausgeben, wenn sie genau zwei Teiler hat (eine Primzahl ist)
                System.out.println(a);
            }
        }
    endZeit = System.currentTimeMillis(); //Endzeit speichern
    long nettoZeit;
    nettoZeit = (endZeit-startZeit); //Endzeit von der Startzeit subtrahieren um Laufzeit herauszufinden
    double laufZeit;
    laufZeit = (nettoZeit/1000);
   	System.out.println("Die Laufzeit betrug "+nettoZeit+" Millisekunden, das entspricht "+laufZeit+" Sekunden"); //Laufzeit ausgeben
    }
	}

Derzeit läuft es, wenn auch sehr langsam. Mit meinem Core2Duo dauern die Primzahlen bis 200000 386 Sekunden. Ich vermute mal, das liegt an der Printanweisung, die sehr an der Performance zieht? Eventuell lasse ich mir nochmal was einfallen. Sonstige Tuningvorschläge?

Achja, ein eher nebensächliches Problem. Am ende rechne ich die Millisekunden in Sekunden um,indem ich durch 1000 teile, um die Laufzeit auszugeben. Leider hab ich nach dem Komma immer eine Null, was ja weniger genau ist. Wie bekomme ich es hin, dass auch die Nachkommastellen berücksichtigt und ausgegeben werden=?
 
Das ist nur deshalb lahm, weil du einen furchtbar miesen Algorithmus verwendest (das println macht natürlich trotzdem was aus...)
 
Ich verstehe nicht, was du damit meinst:

Dadurch fehlt mir zwar die Benutzereingabe, aber Standard sollte ja eh 0 sein.

Die Printanweisungen kosten in der Tat ziemlich viel Zeit!

Wegen dem .0 probier mal:

laufZeit = (nettoZeit/1000.0);

Gruß nebulo
 
Joa, in der Tat, habe das System.out.println einfach mal auskommentiert und die Zeitersparnis liegt im Millisekundenbereich.

Naja, für einen ersten Versuch war es ganz nett, ich werde dann mal versuchen, das Ganze mit der Modulo-Methode zu machen.



Danke für die Hilfe 🙂
 
ChackZz hat gesagt.:
Ich hab jetzt mal die Variable nicht direkt initialisiert sondern eben erst im for.
Dadurch fehlt mir zwar die Benutzereingabe, aber Standard sollte ja eh 0 sein.

Es hätte - um dein Problem mit der Initialisierung zu umgehen einfach das Hinzufügen eines Semikolons am Anfang der Klammer gereicht (was ein Gast ja auch gleich als erste Antwort geliefert hat)
Code:
for (; a <= b; a++)
Deine Version ist einfach syntaktisch falsch, denn wenn du dir die Syntax
nebulo hat gesagt.:
ForStatement
for ( [ Initialization ] ; [ Expression ] ; [ Update ] ) Statement
anschaust, ist zwar "Initialization" optional, nicht aber das nachfolgende Semikolon. Daher dein Übersetzungsfehler.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben