Ein bisschen Effizienter wird es wenn man nur die 2 und ab 3 alle ungeraden Zahlen testet, denn gerade Zahlen ausser der zwei kommen als Primfaktor ja nicht in Frage.
Das Formatieren der Ausgabe würde ich in eine eigene Funktion auslagern.
Ich komme dann auf so etwas:
Code: Alles auswählen
from __future__ import absolute_import, division, print_function
from itertools import chain, count
def factor(number):
if number < 2:
raise ValueError('n must be >= 2')
for candidate in chain([2], count(3, 2)):
if number == 1:
break
exponent = 0
while number % candidate == 0 and number >= candidate:
number //= candidate
exponent += 1
if exponent:
yield (candidate, exponent)
def format_factors(factors):
return '*'.join(
str(factor) if exponent == 1 else '({0}^{1})'.format(factor, exponent)
for factor, exponent in factors
)
def main():
numbers = [
2, 42, 23, 4711, 1024, 208115618, 509018089, 185078311, 910167936
]
for number in numbers:
print('{0} = {1}'.format(number, format_factors(factor(number))))
if __name__ == '__main__':
main()