Seite 1 von 1

Primfaktorenzerlegung

Verfasst: Sonntag 4. März 2007, 01:04
von pot
Hi @ all

Habe erst gerade angefangen, mich mit python zu beschäftigen. Dies ist jetzt mein zweites, einigermassen nützliches python Skript.

Ich wollte einfach mal ein Feedback über den Programmierstil (ich weiss, ist nicht viel Code ^^) und Hinweise was ev. noch besser sein könnte. Ev. ist der Algorithmus nicht ganz korrekt durchdacht. Egal, immer her mit der Kritik ;-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Zerlegt eine gewünschte Zahl in Primfaktoren
#
# Copyright (c) 2007 Remo Wenger

def main():
    input = raw_input('Geben Sie eine Zahl ein: ');
    input = int(input)

    for x in range(2, input):
        while input % x == 0:
            print x
            input = input / x

if __name__ == "__main__":
    main()
MfG,
Pot

Verfasst: Sonntag 4. März 2007, 10:28
von rayo
Hi

Den Namen input ist schlecht gewählt, weil es auch eine Builtin-Funktion gibt die input heisst, darum wird sie auch blau Dargestellt.

Gruss

Verfasst: Sonntag 4. März 2007, 11:33
von pot
rayo hat geschrieben:Den Namen input ist schlecht gewählt, weil es auch eine Builtin-Funktion gibt die input heisst, darum wird sie auch blau Dargestellt.
Danke für den Hinweis.

So long,
Pot

Verfasst: Sonntag 4. März 2007, 12:11
von BlackJack
Das Semikolon am Zeilenende ist überflüssig und aus den beiden Zeilen für Eingabe und Umwandlung in ein `int()` könnte man eine machen.

Falls man grosse Zahlen erwartet, ist `xrange()` speicherschonender als `range()`. Und beim Teilen könnte man etwas Tipparbeit mit den kombinierten "Operator/Zuweisungs"-Operatoren sparen.

Code: Alles auswählen

def main():
    number = int(raw_input('Geben sie eine Zahl ein: '))
    for divisor in xrange(2, number):
        while number % divisor == 0:
            print divisor
            number //= divisor

Verfasst: Sonntag 4. März 2007, 12:41
von pot
BlackJack hat geschrieben:Das Semikolon am Zeilenende ist überflüssig und aus
Ups. Naja ist schwer sich umzugewöhnen ;-) Wieso gibt der python Interpreter keine Fehlermeldung aus, wenn er das sieht?
BlackJack hat geschrieben:den beiden Zeilen für Eingabe und Umwandlung in ein `int()` könnte man eine machen.
Stimmt, danke.
BlackJack hat geschrieben:Falls man grosse Zahlen erwartet, ist `xrange()` speicherschonender als `range()`.
Danke für den Tipp^^ Ich weiss nicht genau ob range schuld war, dass meine Kiste abstürzte, als ich die Primfaktoren von "123456789" wissen wollte.
BlackJack hat geschrieben:Und beim Teilen könnte man etwas Tipparbeit mit den kombinierten "Operator/Zuweisungs"-Operatoren sparen.
Schonwieder was gelernt ;-) Danke

Aufgrund des Systemabsturzes habe ich noch eine kleiner "Sicherheitsmechanismus" (^^) eingebaut:

Code: Alles auswählen

import sys

def main():
    number = int(raw_input('Geben Sie eine Zahl ein: '))

    if len(str(number)) > 6:
        print >> sys.stderr, 'Mehr als sechs Ziffern sind nicht erlaubt'
        sys.exit()

    primfaktoren = []

    for divisor in xrange(2, number):
        while number % divisor == 0:
            primfaktoren.append(divisor)
            number //= divisor

    for primfaktor in primfaktoren:
        print primfaktor

if __name__ == "__main__":
    main()
Wie man sieht habe ich die Primfaktoren in den Tupel primfaktoren angehängt und mir gehofft, so irgendwie die Primfaktoren nebeneinander ausgeben zu lassen. Leider macht print da einfach n Zeilenumbruch. Abhilfe dafür habe ich noch nicht gefunden.

Greets,
Pot

Verfasst: Sonntag 4. März 2007, 13:31
von pyStyler
Hallo,

ist ganz einfach. Am ende der Codezeile 18 ein Komma(, ) setzen.

Code: Alles auswählen

 for primfaktor in primfaktoren:
        print primfaktor,
Gruss
pyStyler

Verfasst: Sonntag 4. März 2007, 13:33
von pot
pyStyler hat geschrieben:ist ganz einfach. Am ende der Codezeile 18 ein Komma(, ) setzen.
Danke

Verfasst: Sonntag 4. März 2007, 14:11
von BlackJack
Ein Semikolon ist ja kein Syntaxfehler sondern für sich alleine bloss überflüssig. Damit kann man mehrere Anweisungen auf einer Zeile schreiben. Was man allerdings nicht machen sollte, da dann die Übersichtlichkeit leidet.

`primfaktoren` ist übrigens kein Tupel sondern eine Liste.

Verfasst: Sonntag 4. März 2007, 14:15
von pot
BlackJack hat geschrieben:Ein Semikolon ist ja kein Syntaxfehler sondern für sich alleine bloss überflüssig. Damit kann man mehrere Anweisungen auf einer Zeile schreiben. Was man allerdings nicht machen sollte, da dann die Übersichtlichkeit leidet.
Achso, danke.
BlackJack hat geschrieben:`primfaktoren` ist übrigens kein Tupel sondern eine Liste.
Mh.. wieder einmal verwechselt.

Verfasst: Sonntag 4. März 2007, 15:37
von Leonidas

Code: Alles auswählen

if len(str(number)) > 6:
würde ich eher als

Code: Alles auswählen

if number >= 1000000:
schreiben.

Verfasst: Sonntag 4. März 2007, 21:49
von pot
Leonidas hat geschrieben:

Code: Alles auswählen

if len(str(number)) > 6:
würde ich eher als

Code: Alles auswählen

if number >= 1000000:
schreiben.
Danke ^^ manchmal studiert man einfach zu weit.