Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Primzahlen Programm mit Turbo Pascal

ZEPH / 10 Antworten / Baumansicht Nickles

Hi Folks!
ich hab in Computertechnik in der schule die aufgabe bekommen ein Prog zu schreiben, das die Primzahlen bis 20000 ausrechnet und anzeigt. ich darf die zahlen 2/3/5/7 als teiler vordefinieren, ab da muss alles andere selbst ausgerechnet werden. die primzahlen sollen in einem array gespeichert werden.
ich hab mir gedacht, dass ich eine variable(x) erhöhe und diese durch die im array gespeicherten zahlen teile und dann auf einen rest prüfe (mit "mod"). wenn der rest dann =0 ist wird die zahl im array gespeichert, und neu begonnen. das so lange bis x=20000.

geht denn das so wie ich es mir gedacht habe oder habt ihr eine leichtere (muss aber auch leicht verständlich bleiben ich hab TP erst seit einem halben jahr), Lösung?!

Schonmal Danke im vorraus für eure Mühen...

bei Antwort benachrichtigen
Andreas42 ZEPH „Primzahlen Programm mit Turbo Pascal“
Optionen

Hi!

Das geht, ist aber warscheinlich keine schnelle Lösung, da für alle Zahlenwerte deiner Variable(x) mehrere Rechenoperationen durchführen musst.

Tipp: programmiere es, das ist für Vergleichszwecke gut!

Du musst natürlich die 0-Modulo Ergebnisse der Divisionen zählen. Wenn diese Zahö >1 ist, dann hast du keine Primzahl (die Zahl war ja dann durch mehrer Werte teilbar).

Die bekannte Alternative ist (glaube ich) der Sieb des Aristoteles:

Nimm einen Array.
Nimm eine Zählvariable.
Beginne mit Zählvariable 3.
:loop
Belege alle Vielfachen der Zählvariablen im Array.
Erhöhe Zählvariable um 2.
Wenn Zählvariable kleiner Anzahl-Arrayelemente/2 dann :loop

Zum schluss erhält man einen Array, dessen Felder für Zahlen, die keine Primzahlen sind gefüllt sind. Die Leeren Felder sind dann Primzahlen (gerade Zahlen lässt man weg).

Ach ja: das kann man noch optimieren. Da war was mit neuen Zählvariablen, die schon im Array belegt wurden. ;-)

Bis denn
Andreas

PS: Programmier beides und vergleiche mal die Laufzeit.

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Borlander ZEPH „Primzahlen Programm mit Turbo Pascal“
Optionen
durch die im array gespeicherten zahlen teile
In diesem Fall kannst Du den Ablauf deutlich beschleunigen, wenn Du nur auf Teilbarkeit mit Primzahlen bis Wurzel(x), bei größeren Werten müsste sich sonst eine Zahl kleiner Wurzel(x) als weiterer Primfaktor ergeben.

wenn der rest dann =0 ist wird die zahl im array gespeichert
Wenn der Rest 0 ist, dann ist die Zahl teilbar - also kann die Überprüfung abgebrochen werden. Die Zahl x kann nur prim sein, wenn sie durch keine Primzahl

CU Borlander
bei Antwort benachrichtigen
PaoloP ZEPH „Primzahlen Programm mit Turbo Pascal“
Optionen

Nur mal eine Frage zur Info. Zwingen Sie euch Pascal zu nehmen ???

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
ZEPH Nachtrag zu: „Primzahlen Programm mit Turbo Pascal“
Optionen

Ja, sonst hätt ich ja schon lang Visual Basic oder so genommen.

bei Antwort benachrichtigen
PaoloP ZEPH „Ja, sonst hätt ich ja schon lang Visual Basic oder so genommen.“
Optionen

Ja ich habe das ich nämlich schon öfter gehört von Lehrern die vor Uhrzeiten mal Pascal gelernt haben dann nix neues mehr lernen wollen und Ihre Schüler das ausbaden müssen.
Bei meinem Neffen war das auch so allerdings nur so lange bis die Schule ins Microsoft Förderprogramm aufgenommen wurde. Nun sind da alle Borprise-Produkte verschwunden.(und das ist auch gut so)

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
ZEPH Nachtrag zu: „Primzahlen Programm mit Turbo Pascal“
Optionen

uses crt;

var p:Array[1..20000] of integer;
s,x: integer;
begin
clrscr;

p[1]:=2;
p[2]:=3;
p[3]:=5;
p[4]:=7;
p[s]:=x;
s:=4

repeat
x:=x+1;
if (x mod p[s])=0 then
p[s]:=x;
s:=s+1;
writeln(x);
until x=20000;

repeat until keypressed;
end.

könnt ihr an dem Code ne Verbesserung vornehmen, weil ich hab voll kein Plan warum das so nich geht und ob das überhaupt richtig is wie ich ins Array schreib...
weil mein CT Lehrer is halt so en Arsch, den kann ich nich fragen. wir müssen das Prog auch bloß schreiben, weil mal vor ein paar jahren ein schüler (der tag und nacht nur geproggt hat weil er keine freunde hatte) ein "ACH SO TOLLES PRIMZAHLEN PROGRAMM GESCHRIEBEN HAT"!!

bei Antwort benachrichtigen
PaoloP ZEPH „uses crt var p:Array 1..20000 of integer s,x: integer begin clrscr p 1 : 2 p 2 :...“
Optionen

ich schau's mir heute Nacht mal an.
Solche Schüler werden dann später hier VIP ;-)
Primzahlen sind das abgekauteste Thema überhaupt von daher gibts da Gott sei Dank genug um Internet.

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
ZEPH Nachtrag zu: „Primzahlen Programm mit Turbo Pascal“
Optionen

Gut danke! wenn das so weiter geht bei mir in CT wird der Kurs abgebrochen. Lehrer kommt rein, gibt uns ne aufgabe und lässt uns damit solang allein bis wir fertig sind, oder auch nich. bei dem is learining by doing, also quasi wie bei Mircodoof!!

bei Antwort benachrichtigen
Wanja ZEPH „Primzahlen Programm mit Turbo Pascal“
Optionen

Hallo!

Fehlt Dir nicht von der Syntax her eine Klammerung bzw. begin & end ?

...
repeat
x:=x+1;
if (x mod p[s])=0 then

=> Begin

p[s]:=x;
s:=s+1;
writeln(x);

=> End

until x=20000;
...


Just my 2 cents

MfG,
Wanja

bei Antwort benachrichtigen
ZEPH Nachtrag zu: „Primzahlen Programm mit Turbo Pascal“
Optionen

uses crt; {Hannes Zechmann, 16.01.2004}

var p:array[1..20000] of boolean;
startzahl, anfangszahl, endzahl, teiler, seite, seiten, zeilen: integer;

begin
repeat
clrscr;
write('Anfangszahl: ');
readln(startzahl);
write('Endzahl: ');
readln(endzahl);
until startzahl
for anfangszahl:=startzahl to endzahl do
begin
p[anfangszahl]:=true;
for teiler:=2 to anfangszahl div 2 do
begin
if (anfangszahl mod teiler)=0 then
begin
p[anfangszahl]:=false;
end;
end;

if p[anfangszahl]=true then
write(anfangszahl:8);
end;

readln;
end.

dank eines freundes gehts jetzt, auch wenns ne ganz andere methode is!

bei Antwort benachrichtigen