Primzahlen mit Array errechnen!

Status
Nicht offen für weitere Antworten.

bpblub

Mitglied
Guten Tag/Nacht,

unzwar lerne ich in der Schule Javaprogrammierung und wir haben jetzt die Aufgabe gestellt bekommen, ein Programm zu schreiben, das Primzahen errechnet mit Arrays.
Ok!
Meine Idee:
Ich nehme als erstes die Zahl 2 und nehme die immer wieder +2 und setze die Arrays die die 2 trifft auf 0,sagen wir mal bis 10000. Danach setze ich die 3 und nehme die immer +3, das bis 10000 und dann nehme ich die 4 und nehme die immer +4 ... das bis 10 und dann dürfte ich genug ausgesiebt haben.

So das Programm was ich schon geschrieben hab:

Code:
static int a = 10001;
static int[] AStack= new int [a];

public static void eingabe()
{
for(it i=1;i<y;i++)
{
AStack[i] = i;
}
}

public static void rechnen()
{
int z=10;
for(int d=2;d<z;d++)
{
    for(int e=0;e<y;e=d+d)
    {
    AStack[e] = 0;
    }
}

public static void ausgeben()
{
for(int u=1;u<y;u++)
{
if(AStack[u] = 0)
{}
else
{
System.out.Println(AStack[u]);
}
}
}

public static void main ( String[] args )
{
eingabe();
rechnen();
ausgeben();
}

so ok, ich hoffe das Programm ist so ok geschrieben, ich kann es gerade nicht Prüfen, hab es ausn Kopf auf der Arbeit rausgeschrieben.
Jetzt kommt aber das Problem, die ersten 10 werden nicht ausgeben, also 2,3,5 und 7. Ist ja auch nur logisch, aber wie ich das Sinnvoll ändern kann?
Jetzt zu euch, könnt ihr mir ein Tipp geben ?
Ich möchte keine Lösung eher ein Hinweis oder Tipp ; )

Vielen Dank schonmal im Vorraus.
lg
blub ; )
 

angelchr

Mitglied
hi,
also ich kann deinen Gedankengängen nicht folgen. 2 dann immer plus ?? 3 dann immer plus.. ?? 2 ist eine primzahl 3 auch 4 ist keine? Was genau machst du?
Google mal nach "sieb des erasthotenes" viellecht hilft dir das weiter

Gruß
Angelchr
 

bpblub

Mitglied
Also ich will einfach nur wenn ich bei der Zahl 2 bin immer +2 machen, weil dann immer
2,4,6,8 ... rausfallen würde und das setze ich auf 0, damit ich es dann aussortieren kann ...

Genau das selbe bei 3
3,6,9,12,15 ... die würden dann auf 0 gesetzt werden und würden dann automatisch ausgesiebt werden ...

Bei 4:
4,8,12,16 ... wobei das bei 2 schon alles rausfällt ...

bei 5:
5,10,15,20,25 ... wird dann auf 0 gesetzt ...

meine Bedinung ist das ja, solange Array 0 ist soll er nichts machen und wenn in den Array eine Zahl ist, die nicht 0 ist, dann soll er sie ausgeben, das war meine Grundidee.

lg
blub ; )
 

0x7F800000

Top Contributor
Der Tipp mit dem Sieb von Erasosthenes war exakt :toll: danach solltest du wirklich mal googln...

hier hab ich sogar meinen alten code aus irgendeiner übung rausgekramt:

Code:
import java.io.*;

public class SieveOfEratosthenes {

public static void main(String[] args){
	
	boolean[] marker=new boolean[2];
	int arrayLength=0;
	
	//read the length of array
	BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
	boolean correctInput=false;
	while(!correctInput){
		correctInput=true;
		System.out.println("Geben Sie die Obergrenze an:");
		try{
			arrayLength=Integer.parseInt(reader.readLine());
			if(arrayLength<0){
				System.out.println("negative arraylänge???");
				correctInput=false;
			}
		}catch(IOException e){
			System.out.println(e);
			correctInput=false;
		}catch(NumberFormatException e){
			System.out.println(
					"Zahlformat ungueltig. Geben Sie eine Naturliche Zahl ein."+
					" Die Zahl sollte nicht groesser als "+Integer.MAX_VALUE+" sein");
			correctInput=false;
		}
	}
	
	if(arrayLength>2){
		//allocate place for boolean values
		try{
			marker=new boolean[arrayLength];
		}catch(OutOfMemoryError e){
			System.out.println(
					"Rufen Sie bei der NASA an, die duerften"+
					" ein Paar Superrechner zu viel haben. Auf"+
					"diesem hier reicht der Speicher nicht aus");
		}
	}
	
	//initialize with "true"
	for(int i=0; i<marker.length; i++){
		marker[i]=true;
	}
	
	//mark 0 and 1: these are not primes, but 1 divides everything, /0 is undefined
	marker[0]=marker[1]=false;
	
	//sorting out reducible elements
	int maxDivisor=(int)Math.sqrt(arrayLength);
	for(int currentDivisor=0; currentDivisor<=maxDivisor; currentDivisor++){
		
		//if this one is already marked as not irreducible, continue 
		if(!marker[currentDivisor]){
			continue;
		}else{
			//mark all n>=currentDivisor^2, currentDivisor|n
			for(int n=currentDivisor*currentDivisor; 
					n<marker.length; n+=currentDivisor){
				marker[n]=false;
			}
		}
	}
	
	//print
	final int COLUMNS=10;
	int col=0;
	
	for(int i=0; i<marker.length; i++){
		if(marker[i]){
			System.out.printf(" %8d",i);
			col++;
			if(col>=COLUMNS){
				col=0;
				System.out.println();
			}
		}
	}
	
}
}
COLUMNS gibt lediglich an, in wievielen spalten die zahlen ausgegeben werden... sonst gibts dazu nichts zu sagen, steht alles bei wikipedia.
 

kowa

Aktives Mitglied
Mach es doch mit Division so wie der Eratosthenes das macht.

Anleitung von www.jjam.de/Java/Applets/Primzahlen/Eratosthenes.html:

1. Schreibe alle natürlichen Zahlen von 2 bis zu einer beliebigen Zahl n auf.
2. Streiche alle Vielfachen von 2 heraus.
3. Gehe zur nächstgrößeren nichtgestrichenen Zahl und streiche deren Vielfache heraus.
3. Wiederhole 3. sooft es geht.
4. Die übriggebliebenen Zahlen sind Primzahlen.

Ist so ähnlich wie deine Methode, wenn man 2 immer mit 2 addiert siebt man quasi auch "Nicht-Primzahlen" aus. Hier läuft es nur mit einer Division.
 

bpblub

Mitglied
ok, ich werd mich mal dahinter setzen, aber mein gedankegang ist doch nicht so ganz falsch oder ? Ich will es ja lernen und nicht gleich eine Lösung haben ; )

Vielen Dank für die Antworten, wie ich gepostet habe, war ok oder eher nicht ?

lg
blub
 

angelchr

Mitglied
Der Ansatz deiner Lösung ist "nicht schlecht" allerdings nicht effizient. Wie du schon selber gesagt hast berechnest du sehr vieles doppelt. Der Algrorithmus von Eratosthenes ist anfangs recht langsam und wird dann immer schneller. Deiner ist Konstant langsam. Dazu kommt noch dass eine Multiplikation mit 2 eindeutig schneller ist wie ein plus 2... Rein effizienztechnisch gesehen, da eine multiplikation mit einem Bitshift realisiert wird.

Gruß
angelchr
 

Marco13

Top Contributor
angelchr hat gesagt.:
Dazu kommt noch dass eine Multiplikation mit 2 eindeutig schneller ist wie ein plus 2... Rein effizienztechnisch gesehen, da eine multiplikation mit einem Bitshift realisiert wird.

... realisiert werden kann - ob das gemacht wird, und ob das schneller oder langsamer ist, als eine Addition sei mal dahingestellt :wink: (Ich würde addieren...)
 

0x7F800000

Top Contributor
aber um etwas mit bitshifts zu multiplizieren, muss man:

1) den faktor als summe von zweierpotenzen darstellen: zählt nicht, weil alles in 2er potenzen gerechnet wird = 0 aufwand
2) für jede "1" in der zweierpotenz einen bitschift durchführen: n mal wenn insgesamt n-mal die "1" in der binärdarstellung des faktors vorkommt
3) für jede "1" eine summation von den bit-ge-shifteten zahlen ausführen, also n mal die addition

=> um ein produkt zu berechnen braucht man doch definitiv mindestens eine addition, und das ist sicherlich langsamer als einfach nur eine addition...


korrigiert mich wenn ich mir das irgendwie falsch vorstelle :roll:
 

bpblub

Mitglied
ah interessant, ich finde so diskussionen gut, da lernt man immer viel ; )
Ein Bitshift ist also ein kurz gesagt ein "guter" Algorithmus ?

lg
blub
 

schalentier

Gesperrter Benutzer
Aaahh... nu verwirrt den armen blub doch nicht. Ein Bitshift bedeutet, das die Bits einer Zahl verschoben werden.
Code:
int x = 2; // binaer: 0010
int y = x>>1; // Bitshift um 1 Bit nach rechts: 0001 (1 dezimal)
int z = x<<1; // nach links: 0100 (4 dez.)

Wie du siehst entspricht das verschieben um 1 Bit nach rechts der Division durch 2, ein Verschieben nach links der Multiplikation mit 2. Und das ist theoretisch schneller als die Multiplikation (bzw Division) - praktisch aber nur, wenn man das mit einer hardwarenahen Programmiersprache (z.b. C/C++) macht. Und selbst da sollte ein vernuenftiger Compiler ein "*2" durch ein "<<1" ersetzen.

Hat aber alles nichts mit deinem Primzahlenalgorithmus zu tun...
 

Ark

Top Contributor
Ich finde dieses Sieben alles andere als effizient. Ich würde ausnutzen, dass als zu untersuchen notwendige Teiler nur die in Frage kommen, die höchstens so groß sind wie die Quadratwurzel aus der zu untersuchenden Zahl. Außerdem müssen nur die vorangegangenen Primzahlen im genannten Intervall zum Test herangezogen werden. So habe ich das jedenfalls in Erinnerung, könnte auch irren.

Ark
 

0x7F800000

Top Contributor
schalentier hat gesagt.:
Ein Bitshift bedeutet, das die Bits einer Zahl verschoben werden.
was what hast have du you jetzt said gesagt now? :bae:

Ark hat gesagt.:
ch würde ausnutzen, dass als zu untersuchen notwendige Teiler nur die in Frage kommen, die höchstens so groß sind wie die Quadratwurzel aus der zu untersuchenden Zahl.
jo, das hast du richtig in erinnerung:
mein code hat gesagt.:
Code:
int maxDivisor=(int)Math.sqrt(arrayLength);
aber um effizienz geht es hier nicht wirklich, mit so einem doofen sieb kann man eh niemals etwas nützliches aussieben, die primzahlen kannst du vieelicht in Ulam's Spirale reinzeichnen oder Pi(x) skizzieren... Für nützliche 2-3 Hunderstellige zahlen funktioniert es eh nicht mehr...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S Primzahlen in Array ausgeben Java Basics - Anfänger-Themen 14
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
R primzahlen im array Java Basics - Anfänger-Themen 33
L Primzahlen im Array ausgeben Java Basics - Anfänger-Themen 3
sserio Wieso werden nicht alle Primzahlen bis 1000 in meine Liste gepackt ? Java Basics - Anfänger-Themen 8
B Primzahlen bis 100 addieren Java Basics - Anfänger-Themen 16
H Primzahlen finden - Zeit optimieren Java Basics - Anfänger-Themen 34
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
M Rekursives Programm zum Anzeigen von Primzahlen Java Basics - Anfänger-Themen 3
P Primzahl mit Angabe der höchsten Primzahl und Angabe der Anzahl von Primzahlen bis 100 Java Basics - Anfänger-Themen 8
Java The Hutt Primzahlen - die ersten 100 Java Basics - Anfänger-Themen 17
N Erste Schritte Primzahlen-ArrayIndexOutOfBounds Java Basics - Anfänger-Themen 23
R Primzahlen Zähler Programm / Benachbarte Primzahlen Java Basics - Anfänger-Themen 30
D Klassen Primzahlen überprüfen Java Basics - Anfänger-Themen 3
I Primzahlen Java Basics - Anfänger-Themen 17
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
M Erste Schritte primzahlen ermitteln, nur zahlen als eingabe erlauben Java Basics - Anfänger-Themen 34
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
M Primzahlen, nur jede 2te ausgeben Java Basics - Anfänger-Themen 11
T Primzahlen Fehler Java Basics - Anfänger-Themen 4
K Primzahlen Java Basics - Anfänger-Themen 6
P Primzahlen Java Basics - Anfänger-Themen 3
A Methoden Primzahlen erstellen von 1 bis 100-Codeprobleme Java Basics - Anfänger-Themen 2
H Variablenverfolgung - Primzahlen Java Basics - Anfänger-Themen 7
G Primzahlen Java Basics - Anfänger-Themen 6
D Primzahlen und Rekursive Liste Java Basics - Anfänger-Themen 29
S Primzahlen bis 1000 ausgeben Java Basics - Anfänger-Themen 3
K Methoden Primzahlen Java Basics - Anfänger-Themen 33
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
F Primzahlen in Zahlenblöcken ausgeben Java Basics - Anfänger-Themen 9
M Primzahlen - es werden alle Nicht-Primzahlen ausgegeben Java Basics - Anfänger-Themen 5
M primzahlen Java Basics - Anfänger-Themen 4
S Programm zu Ermittlung von Primzahlen Java Basics - Anfänger-Themen 14
E Programm zum Primzahlen ausgeben-Fehler Java Basics - Anfänger-Themen 12
X Primzahlen Java Basics - Anfänger-Themen 7
S Primzahlen Java Basics - Anfänger-Themen 12
B Programmierobjekt - Primzahlen Java Basics - Anfänger-Themen 2
D Primzahlen ausgeben. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
N Primzahlen Java Basics - Anfänger-Themen 5
I Primzahlen check, String prüfen lassen. Java Basics - Anfänger-Themen 6
A OOP Programm zum bestimmen von Primzahlen, OutofBoundsException Java Basics - Anfänger-Themen 10
apple987123 Primzahlen Java Basics - Anfänger-Themen 12
A Primzahlen: ein paar offene Fragen Java Basics - Anfänger-Themen 2
T Primzahlen Java Basics - Anfänger-Themen 6
G Primzahlen Java Basics - Anfänger-Themen 18
B Primzahlen berechnen - Wieso unterschiedliche Java Basics - Anfänger-Themen 3
B Primzahlen Algorithmus - wo ist der Fehler ? Java Basics - Anfänger-Themen 2
E Primzahlen Java Basics - Anfänger-Themen 5
H Miller Rabin Test Primzahlen werden teilweise nicht gefunden Java Basics - Anfänger-Themen 5
M Wer kann mir bei Primzahlen helfen ? Java Basics - Anfänger-Themen 4
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
kulturfenster Primzahlen berechnen Java Basics - Anfänger-Themen 11
D Primzahlen Java Basics - Anfänger-Themen 4
N Zerlegung in Primzahlen Java Basics - Anfänger-Themen 7
F Programm Primzahlen Java Basics - Anfänger-Themen 5
J Primzahlen errechnen.ArrayLists abgleichen Java Basics - Anfänger-Themen 2
M Primzahlen Java Basics - Anfänger-Themen 6
C Primzahlen Java Basics - Anfänger-Themen 7
C Primzahlen Java Basics - Anfänger-Themen 2
S Primzahlen Java Basics - Anfänger-Themen 49
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben