Seite 1 von 1

Problem bei einem Primzahlprogramm

Verfasst: Sonntag 20. Juni 2010, 13:44
von Naklicani
Als HA in Info muss ich ein Pythonprogramm schreiben. Das soll überprüfen ob eine eingegebene Zahl eine Primzahl ist und gibt danach alle Primzahlen bis
zur eingegeben Zahl aus. Nun die Funktion ist_prim(n) funktioniert, aber die funktion prim_list funktioniert nicht, wie sie soll. Wenn ich z.B. 10 eingebe,
gibt er dann als Primzahlen bis 10 nur 2 aus, obwohl auch noch die Zahlen 3,5 und 7 dazugehören. Könntet ihr mir bitte helfen?
Was stimmt den da nicht, ich verzweifle langsam... :( :( :( :( :(

Code: Alles auswählen

 
# Primzahlen.py
# Prüfung ob Primzahl und Ausgabe aller Primzahlen bis zu dieser Zahl

def ist_prim(n):
    """ Prüfung ob n eine Primzahl ist """
    teiler = 3
    menge = 0
    if n > 2:
        if n % 2 != 0:
            reichweite = n // 2
            while teiler <= reichweite and menge == 0:
                if zahl % teiler == 0:
                    menge += 1
                teiler += 2
                reichweite = zahl // teiler
        if menge == 1 or zahl % 2 == 0:
            return False
        else:
            return True
    else:
        if n == 2:
            return True
        return False

def prim_list(n):
    """ Erzeugung von einer Liste von Primzahlen bis zu n """
    primzahlen_n = []
    if n >= 2:
        primzahlen_n.append(2)
        for k in range(3,n+1):
            if ist_prim(k):
                primzahlen_n.append(k)
    return primzahlen_n

# Hauptprogramm
zahl = int(input("Bitte geben sie eine natürliche Zahl ein: "))
print("Primzahl:","ja" if ist_prim(zahl) else "nein")
print("Alle Primzahlen bis zu dieser Zahl:",end=" ")
for k in prim_list(zahl):
    print(k,end=" ")

Re: Problem bei einem Primzahlprogramm

Verfasst: Sonntag 20. Juni 2010, 13:52
von cofi
Dein Fehler steckt in `ist_prim`. Btw reichlich unschoen, dass du dich in der Funktion auf globale Variable `zahl` berufst.

Re: Problem bei einem Primzahlprogramm

Verfasst: Sonntag 20. Juni 2010, 14:20
von sma
Hättest du eine korrekte Funktion `is_prime`, könnte `prime_list` übrigens auch so aussehen:

Code: Alles auswählen

def prime_list(n):
    return [i for i in range(2, n + 1) if is_prime(i)] 
Stefan

Re: Problem bei einem Primzahlprogramm

Verfasst: Sonntag 20. Juni 2010, 16:05
von BlackJack
Wenn man das Prädikat schon so schön als Funktion hat, könnte man auch die `filter()`-Funktion verwenden:

Code: Alles auswählen

def prime_list(n):
    return filter(is_prime, xrange(2, n + 1))

Re: Problem bei einem Primzahlprogramm

Verfasst: Sonntag 20. Juni 2010, 17:19
von pillmuncher
Ich würde zuerst mal für größere Übersichtlichkeit sorgen:

Code: Alles auswählen

def ist_prim(n):
    """ Prüfung ob n eine Primzahl ist """

    if n < 2:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    teiler = 3
    menge = 0
    reichweite = n // 2

    while teiler <= reichweite and menge == 0:
        if zahl % teiler == 0:
            menge += 1
        teiler += 2
        reichweite = zahl // teiler

    return not (menge == 1 or zahl % 2 == 0)
Jetzt musst du nur noch überlegen, warum dein Algorithmus nicht funktioniert.

zB. willst du ja nicht wissen, ob 'zahl' eine Primzahl ist, sondern ob 'n' eine ist. Desweiteren sollte dir der dritte if-Block zeigen, wie der Algorithmus aussehen könnte (eine Zahl z ist prim, wenn für alle Zahlen n mit 1 < n < sqr(z) gilt: z % n != 0)

Re: Problem bei einem Primzahlprogramm

Verfasst: Sonntag 20. Juni 2010, 18:16
von Naklicani
Vielen Dank für die antworten :D :D
Ich habe die Fehler gefunden. Ich habe nämlich globale statt lokale variablen innerhalb einer Funktion benutzt.
Das mit der Übersichtlichkeit war auch ein guter Tipp und mit dem Algorithmus ist auch alles OK.
Richtig sieht das programm dann so aus: :D :D :D :D :D :D

Code: Alles auswählen

# Primzahlen.py
# Prüfung ob Primzahl und Ausgabe aller Primzahlen bis zu dieser Zahl

def ist_prim(n):
    """ Prüfung ob n eine Primzahl ist """
    if n < 2:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    teiler = 3
    menge = 0
    reichweite = n // 2
    while teiler <= reichweite and menge == 0:
        if n % teiler == 0:
            menge += 1
        teiler += 2
        reichweite = n // teiler
    return not (menge == 1 or  n % 2 == 0)
            
def prim_list(n):
    """ Erzeugung von einer Liste von Primzahlen bis zu n """
    primzahlen = list()
    for k in range(2,n):
        if ist_prim(k):
            primzahlen.append(k)
    return primzahlen

# Hauptprogramm
zahl = int(input("Bitte geben sie eine natürliche Zahl ein: "))
print("Primzahl:","ja" if ist_prim(zahl) else "nein")
print("Primzahlen bis",zahl,":",end=" ")
for k in prim_list(zahl):
    print(k,end=" ")
:mrgreen:

Re: Problem bei einem Primzahlprogramm

Verfasst: Mittwoch 30. Juni 2010, 16:30
von theotter
Naja, bei mir funzt dein Code nicht, aber ich kann dir mal meine eigene(hat nichts mit deinem Code zutun) Version zeigen:

import time
print "Wenn nichts weiter kommt ist die eingebene Zahl keine Primzahl."
print "1,2 sind Primzahlen, NICHT eingeben."
a = 0
y = 2
while True:
time.sleep(0.1)
i = 0
y = y + 1
for x in range(2,y):
b = y % x
if b is not 0 and y > x:
i = i + 1
if i == (y-2):
a = a + 1
print y,"= Primzahl, Nr.",a
Das mit der Zeit kann auch abstellen, aber ansonsten ging das mit der Auflistung nen bisschen schnell.

Re: Problem bei einem Primzahlprogramm

Verfasst: Mittwoch 30. Juni 2010, 16:33
von theotter
Ich bin erst seit heute in diesem Forum und wollte mal wissen wie man hier den Code richtig anzeigen lassen kann, dh.h wie in nem Editor mit Highlighting und so.

Re: Problem bei einem Primzahlprogramm

Verfasst: Mittwoch 30. Juni 2010, 16:46
von Hyperion
theotter hat geschrieben:Ich bin erst seit heute in diesem Forum und wollte mal wissen wie man hier den Code richtig anzeigen lassen kann, dh.h wie in nem Editor mit Highlighting und so.
Da das eine Meta-Frage ist, solltest Du das nicht an diesen Thread hängen, sondern als neues Thema in "Offtopic" posten.

Ich kapiere sie aber auch nicht genau? Meinst Du die Anzeige des Quellcodes mit Highlighting? Dafür gibts den Code- bzw. den Python-Button über dem Eingabefeld. (habe ich ürbigens in der FAQ nicht gefunden - fehlt das oder bin ich blind?)

Wenn Du extern meinstm brauchst Du einen Editor, der so etwas untersstützt (und alle "guten" tun das :-D )

Wenn von diesen Alternativen nichts passt, musst Du wohl die Frage abändern...

Re: Problem bei einem Primzahlprogramm

Verfasst: Mittwoch 30. Juni 2010, 17:54
von Jack Daniels
print "1,2 sind Primzahlen, NICHT eingeben."
Genau genommen ist 1 per Definition nicht prim... *klugscheiß*

Re: Problem bei einem Primzahlprogramm

Verfasst: Mittwoch 30. Juni 2010, 21:09
von theotter
Ahh, danke Hyperion.
Ich meinte die Highlightning Fkt. von diesem Forum.
Irgendwer wäre bestimmt auf die Idee gekommen die 1 einzugeben, um zu testen ob es ne Primzahl ist!
XDD
Also sicher ist sicher!

Re: Problem bei einem Primzahlprogramm

Verfasst: Mittwoch 30. Juni 2010, 21:19
von BlackJack
@theotter: Und man sollte auch die 1 oder die 2 eingeben können. Statt dem Benutzer zu sagen dass er sie nicht eingeben soll, sollte für diese beiden Zahlen halt auch eine korrekte Antwort ausgegeben werden.