Seite 1 von 1

Primzahlen

Verfasst: Mittwoch 30. August 2006, 15:40
von Ludden
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)

Verfasst: Mittwoch 30. August 2006, 16:08
von Leonidas
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.

Verfasst: Mittwoch 30. August 2006, 16:11
von Joghurt
Du hast "break" mit "continue" verwechselt, wobei du das auch ganz weglassen kannst.

Verfasst: Mittwoch 30. August 2006, 16:14
von Ludden
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 ... :)

Verfasst: Mittwoch 30. August 2006, 16:22
von Leonidas
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.

Verfasst: Mittwoch 30. August 2006, 16:28
von Ludden
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()

Verfasst: Mittwoch 30. August 2006, 16:31
von Joghurt
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!

Verfasst: Mittwoch 30. August 2006, 16:33
von Ludden
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

Verfasst: Mittwoch 30. August 2006, 16:40
von Joghurt
Hab noch ein paar Änderungen und Kommentar vorgenommen.

Verfasst: Mittwoch 30. August 2006, 17:04
von Ludden
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 :)

Verfasst: Mittwoch 30. August 2006, 17:12
von Leonidas
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.

Verfasst: Mittwoch 30. August 2006, 17:38
von Ludden
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.