Primzahlen

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
Ludden
User
Beiträge: 6
Registriert: Mittwoch 30. August 2006, 15:35

Guten Tag,
hab mal ein kleines Script geschrieben find den Fehler aber irgendwie nicht

Es läuft soweit schon, aber es gibt irgendwie immer nur die 1. Zahl aus und zwar 3

Code: Alles auswählen

#primzahl.py
#Funktionen

def primzahl(zahl):
    if zahl<=2 :
        prim=1
    else:
            for i in range(2,zahl+1):
                if zahl%i==0:
                    prim=0
                    break
                else:
                    prim=1
                    return prim

def eingabe():
    print "Ausgabe aller Primzahlen in einem Intervall: "
    a=input("Untere Intervallgrenze: ")
    b=input("Obere Intervallgrenze: ")
    return a,b

def verarbeitung(intervall):
    prim=[]
    for i in range(intervall[0],intervall[1]+1):
        if primzahl(i):
            prim+=[i]
            return prim
def ausgabe(primzahlen):
    print "Primzahlen"
    for zahl in primzahlen:
        print zahl,
#Hauptprogramm
intervall = eingabe()
primzahlListe = verarbeitung(intervall)
ausgabe(primzahlListe)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das ist ganz einfach: weil bei dir in def verarbeitung ein return prim ist - die Funktion beendet sich sofort, wenn die erste Primzahl gefunden wird. Wenn du das return dort rausnimmst sollte es besser gehen.
Überhaupt hast du noch mehr überflüssigen Code und deine einrückungen sind ungleichmäßig, noch dazu hälst du dich nicht an den Styleguide: PEP8.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Du hast "break" mit "continue" verwechselt, wobei du das auch ganz weglassen kannst.
Ludden
User
Beiträge: 6
Registriert: Mittwoch 30. August 2006, 15:35

Ich muss in meiner verarbeitung doch prim zurückgeben, sonst hab ich nichts, was ich in der ausgabe ausgeben könnte? Also so hab ich mir das mal gedacht :)
Joghurt hat geschrieben:Du hast "break" mit "continue" verwechselt, wobei du das auch ganz weglassen kannst.
ändert leider nichts, an der Tatsache , dass irgendwie nur die 3 ausgegeben wird ... :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ludden hat geschrieben:Ich muss in meiner verarbeitung doch prim zurückgeben, sonst hab ich nichts, was ich in der ausgabe ausgeben könnte? Also so hab ich mir das mal gedacht :)
Stimmt - aber dann hast du return prim falsch eingerückt - du müsstest es dann in der gleichen Ebene wie prim = [] stehen haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ludden
User
Beiträge: 6
Registriert: Mittwoch 30. August 2006, 15:35

Leonidas hat geschrieben:Stimmt - aber dann hast du return prim falsch eingerückt - du müsstest es dann in der gleichen Ebene wie prim = [] stehen haben.
Du hast recht , ich versteh aber nicht warum ... außerdem fehlt noch ein return prim bei der ersten If-Schleifen in primzahl()
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Das return war auch noch falsch eingerückt. Ich hab das Programm mal ein bisschen korrigiert. Gutes Pythonprogrammierstil ist das aber immer noch nicht:

Code: Alles auswählen

from math import sqrt
def primzahl(zahl):
    if zahl < 2 :
        return False # zahl <=2 => prim ist falsch! z.B. sind weder 1 noch -5  prim!
    else:
        if zahl%2 == 0:
          return zahl == 2 # die einzige gerade Primzahl ist 2.
        for i in range(3,int(sqrt(zahl)),2): # Wir brauchen die gerade Zahlen nicht zu testen
            if zahl%i==0:
                return False
        return True

def eingabe():
    print "Ausgabe aller Primzahlen in einem Intervall: "
    a=input("Untere Intervallgrenze: ")
    b=input("Obere Intervallgrenze: ")
    return a,b

def verarbeitung(intervall):
    prim=[]
    for i in range(intervall[0],intervall[1]+1):
        if primzahl(i):
            prim.append(i) # prim += [i] ist schlechter Stil und verwirrend!
    return prim

def ausgabe(primzahlen):
    print "Primzahlen"
    for zahl in primzahlen:
        print zahl,

#Hauptprogramm
intervall = eingabe()
primzahlliste = verarbeitung(intervall)
ausgabe(primzahlliste)
Du musst übrigens immer nur bis sqrt(n) testen.
Denn selbst wenn eine Zahl nur 2 Primfaktoren (n = a*b) hat, muss a oder b kleiner gleich sqrt(n) sein, denn wenn beide größer wären, gälte:
n = a * b = (sqrt(n) + delta_a) * (sqrt(n) + delta_b) = n + sqrt(n)*(delta_a+delta_b) + (delta_a*delta_b) > n. Widerspruch!
Zuletzt geändert von Joghurt am Mittwoch 30. August 2006, 16:39, insgesamt 4-mal geändert.
Ludden
User
Beiträge: 6
Registriert: Mittwoch 30. August 2006, 15:35

jo ... naja mit meinen schlechten Stil hab ichs auch erstmal hinbekommen und für mein 1. Programm kann ich mich nicht beschweren hab schon einiges in PHP gemacht, wobei ich da eigentlich immer für meinen Stil gelobt wurde ... ja stimmt an return True und False hab ich garnicht gedacht danke für den Tipp
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Hab noch ein paar Änderungen und Kommentar vorgenommen.
Ludden
User
Beiträge: 6
Registriert: Mittwoch 30. August 2006, 15:35

ok danke, ich hab jetzt auch mal festgestellt, dass ich mit primzahl() garnicht rausfinde ob das wirklich eine primzahl ist oder nicht sondern nur obs gerade oder ungerade ist :\ muss ich wohl doch deine version holen mit der wurzel , muss das aber erstmal nachvollziehen ... das mit append sieht wirklich sauberer aus :) danke für den tipp

an True und False hab ich jetzt garnicht weiter gedacht :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ludden hat geschrieben:ok danke, ich hab jetzt auch mal festgestellt, dass ich mit primzahl() garnicht rausfinde ob das wirklich eine primzahl ist oder nicht sondern nur obs gerade oder ungerade ist :\ muss ich wohl doch deine version holen mit der wurzel , muss das aber erstmal nachvollziehen ...
Du kannst dich auch an primebench.py orientieren, was ziemlich hochoptimierten Mathfun-Code von Adam Gurno verwendet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ludden
User
Beiträge: 6
Registriert: Mittwoch 30. August 2006, 15:35

Nunja orientieren ist gut :) ... den 1. Block versteh ich ja noch danach hörts auf naja, ich wollte ja auch keinen Code entwerfen um Primzahlen zu finden sondern einfach nurmal n bisschen rumprobieren.
Antworten