Problem bei einem Primzahlprogramm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Naklicani
User
Beiträge: 2
Registriert: Sonntag 20. Juni 2010, 13:23

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=" ")
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dein Fehler steckt in `ist_prim`. Btw reichlich unschoen, dass du dich in der Funktion auf globale Variable `zahl` berufst.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
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))
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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)
In specifications, Murphy's Law supersedes Ohm's.
Naklicani
User
Beiträge: 2
Registriert: Sonntag 20. Juni 2010, 13:23

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:
theotter
User
Beiträge: 27
Registriert: Mittwoch 30. Juni 2010, 16:08

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.
theotter
User
Beiträge: 27
Registriert: Mittwoch 30. Juni 2010, 16:08

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Jack Daniels
User
Beiträge: 30
Registriert: Freitag 1. Januar 2010, 11:38

print "1,2 sind Primzahlen, NICHT eingeben."
Genau genommen ist 1 per Definition nicht prim... *klugscheiß*
theotter
User
Beiträge: 27
Registriert: Mittwoch 30. Juni 2010, 16:08

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!
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.
Antworten