Forum: PC-Programmierung Primzahlprüfung wirkt


von Pankaj J. (pankaj_j)


Lesenswert?

Ich habe versucht, ein Programm zu schreiben, das eine imputierte Zahl 
akzeptiert und überprüft, ob es sich um eine Primzahl handelt.

Der Code, den ich bisher gemacht habe, funktioniert perfekt, wenn die 
Zahl tatsächlich eine Primzahl ist. Wenn die Zahl keine Primzahl ist, 
verhält sie sich seltsam. Ich frage mich, ob jemand mir sagen kann, was 
das Problem mit dem Code ist.
1
a=2
2
Zahl=13
3
while num > a :
4
  if num%a==0 & a!=num:
5
    print('not prime')
6
    a=a+1
7
  anders:
8
    print('prime')
9
    a=(Zahl)+1

Das Ergebnis, wenn 24 imputiert wird, ist:
1
nicht prim
2
nicht prim
3
nicht prim
4
prim

Wie würde ich den Fehler beheben, bei dem bei jeder ungeraden Primzahl 
und nicht bei jeder geraden Primzahl gemeldet wird?

Referenz: 
[here](https://www.scaler.com/topics/prime-number-program-in-python/)

von SR (Gast)


Lesenswert?

Pankaj J. schrieb:
> Wie würde ich den Fehler beheben, bei dem bei jeder ungeraden Primzahl
> und nicht bei jeder geraden Primzahl gemeldet wird?

Soso, gerade Primzahlen..

von Michael B. (laberkopp)


Lesenswert?

Pankaj J. schrieb:
> Wie würde ich den Fehler beheben

Programmieren lernen.

Der code hat keinerlei Ähnlichkeit mit einem den unterschiedlichen 
Ansätze auf deiner verlinkten Seite.

Es ist weitgehend Unsinn, Ausgaben wie prim und nicht prim innerhalb der 
while Schleife zu machen.

Auch deutsches Python wird der Computer nicht verstehen.

von Frank L. (hermastersvoice)


Lesenswert?

müsste es nicht amputiert oder imputiniert heissen?

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Nein, dann müsste es impotent heißen.

Aber wegen dem Thema:

So kleine Zahlen kann man prima testen, indem man probiert, sie durch 
alle kleineren Zahlen zu teilen, bis das Ergebnis kleiner als 3 wird. 
Unterhalb von 3 bleiben nur die ganzzahligen Teiler 2 und 1 übrig, 2 
geht nicht weil es keine geraden Primzahlen gibt und 1 macht keinen Sinn 
weil jede Zahl durch 1 teilbar ist.

von Cyblord -. (cyblord)


Lesenswert?

SR schrieb:
> Soso, gerade Primzahlen..

Ja nun, eine gibt es.

von Georg (Gast)


Lesenswert?

Pankaj J. schrieb:
> Der Code, den ich bisher gemacht habe, funktioniert perfekt, wenn die
> Zahl tatsächlich eine Primzahl ist

So eine Funktion kenne ich auch: immer ja sagen.

Georg

von Andreas H (Gast)


Lesenswert?

Ben B. schrieb:
> 2
> geht nicht weil es keine geraden Primzahlen gib

Ehm, 2 IST eine gerade Primzahl^^. Ok, die Einzige :)

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Haarspalterei.

@TE: Kannst Du mit PHP was anfangen? Hier mal ein ganz alter Fetzen Code 
von mir, so alt, daß ich dafür nicht mal eine Garantie übernehme, daß 
der fehlerfrei und zuverlässig funktioniert. Primzahltests sind lustig, 
jeder programmiert sowas und keiner brauchts hinterher auch.
1
<?php
2
3
$zahl=9999937; //Zahl zur Prüfung
4
5
if (($zahl%2==0) and ($zahl!=2)) {
6
 echo'Es gibt keine geraden Primzahlen >2.';die;
7
}
8
9
$min_divisor=floor($zahl/3)+1;
10
for ($n=3;$n<=$min_divisor;$n+=2) {
11
 if ($zahl%$n==0) {break;}
12
}
13
14
if ($n>$min_divisor) {
15
 echo $zahl.' ist eine Primzahl.';die;
16
} else {
17
 echo $zahl.' ist durch '.$n.' teilbar.';
18
}
19
20
?>

von Εrnst B. (ernst)


Lesenswert?

Wo wir schon bei PHP waren, hier noch ein alter Fetzen Perl dazu:
1
perl -wle '$_=1;(1x$_)!~/^(11+)\1+$/&&print while++$_'

von Sebastian R. (sebastian_r569)


Lesenswert?

Εrnst B. schrieb:
> hier noch ein alter Fetzen Perl dazu:

Darf ich mir von jemandem einen alten Fetzen RegEx mit der Funktion 
wünschen?

Ich mein, ich verstehe RegEx nicht, aber es sieht toll aus :D

von Εrnst B. (ernst)


Lesenswert?

Sebastian R. schrieb:
> ich verstehe RegEx nicht

der Trick ist hier:
(1x$_) !~ /^(11+)\1+$/

$_ ist die gerade geprüfte Zahl.
"1"x$_ erzeugt einen String "1111...." in der Länge der geprüften Zahl.
/^(11+)\1+$/
Sucht mit "(11+)" nach einem Teil-String "11...", mit dem sich, wenn er 
beliebig oft wiederholt wird ("\1+") der gesamten String (sichergestellt 
durch ^ und $) ausfüllen lässt.

Insofern selber Ansatz zur Berechnung, nur dass die Suche nach einem 
Ganzzahligen Teiler >= 2 eben der Regex-Engine überlassen wird.

von Sebastian R. (sebastian_r569)


Lesenswert?

Εrnst B. schrieb:
> der Trick ist hier:

Ach, das ist schon RegEx. Deshalb bin ich selber auf die Idee gekommen.

Ja dann - Danke :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.