Primfaktorenzerlegung

Code-Stücke können hier veröffentlicht werden.
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Primfaktorenzerlegung

Beitragvon pot » Sonntag 4. März 2007, 01:04

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Beitragvon rayo » Sonntag 4. März 2007, 10:28

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
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Sonntag 4. März 2007, 11:33

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
BlackJack

Beitragvon BlackJack » Sonntag 4. März 2007, 12:11

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
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Sonntag 4. März 2007, 12:41

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
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Sonntag 4. März 2007, 13:31

Hallo,

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

Code: Alles auswählen

 for primfaktor in primfaktoren:
        print primfaktor,


Gruss
pyStyler
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Sonntag 4. März 2007, 13:33

pyStyler hat geschrieben:ist ganz einfach. Am ende der Codezeile 18 ein Komma(, ) setzen.


Danke
BlackJack

Beitragvon BlackJack » Sonntag 4. März 2007, 14:11

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.
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Sonntag 4. März 2007, 14:15

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 4. März 2007, 15:37

Code: Alles auswählen

if len(str(number)) > 6:

würde ich eher als

Code: Alles auswählen

if number >= 1000000:

schreiben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Beitragvon pot » Sonntag 4. März 2007, 21:49

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.

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]