Python :: Aufgabe #335
5 Lösungen
Primfaktorzerlegung und Potenzschreibweise
Fortgeschrittener - Python
von JKooP
- 03.04.2021 um 09:53 Uhr
1. Schreibe eine Methode/Funktion, die jede Integer- Zahl in ihre Primfaktoren zerlegen kann
und das Ergebnis als Array/Liste zurückgibt.
Beispiel:
24 = 2*2*2*3
Lösung:
a = { 2, 2, 2, 3 }
2. Schreibe eine weitere Methode/Funktion, die die Werte des Arrays aus Aufgabe 1
in Potenzschreibweise überführt und auf dem Bildschirm ausgibt.
Das Zeichen zur Darstellung kann je nach Vorliebe/Programmiersprache variieren (^, **, h, ...).
Lösung:
2*2*2 = 2^3
3 = 3^1
Ausgabe:
2^3 * 3^1
Viel Spaß
und das Ergebnis als Array/Liste zurückgibt.
Beispiel:
24 = 2*2*2*3
Lösung:
a = { 2, 2, 2, 3 }
2. Schreibe eine weitere Methode/Funktion, die die Werte des Arrays aus Aufgabe 1
in Potenzschreibweise überführt und auf dem Bildschirm ausgibt.
Das Zeichen zur Darstellung kann je nach Vorliebe/Programmiersprache variieren (^, **, h, ...).
Lösung:
2*2*2 = 2^3
3 = 3^1
Ausgabe:
2^3 * 3^1
Viel Spaß
Lösungen:
def ausgabe(faktoren):
n = faktoren.count(faktoren[0])
print('{}^{}'.format(faktoren[0], n), end='')
for i in range(n):
faktoren.pop(0)
if len(faktoren) > 0:
print(end=' * ')
ausgabe(faktoren)
def primfaktoren(zahl):
i = 2
faktoren = []
while i <= zahl:
if zahl % i == 0:
faktoren.append(i)
zahl = zahl / i
else:
i = i + 1
return ausgabe(faktoren)
primfaktoren(24)
zahl = 27861786873687128719827
zahl_text = str(zahl)
# primfaktorliste mit Duplikaten
i = 2
liste = []
while i <= zahl:
if zahl % i == 0:
liste.append(i)
zahl = int(zahl / i)
i = 1
print(liste)
i += 1
# Primfaktoren ohne Duplikate
liste2 = list(set(liste))
liste2.sort()
# Anzahl Primfaktoren
anzahl = []
for element in liste2:
i = 0
for e in liste:
if element == e:
i += 1
anzahl.append(i)
# Ausgabe
print(zahl_text, "=")
for i in range(0, len(liste2) - 1):
print(liste2[i], "^", anzahl[i], "* ", end="")
print(liste2[len(liste2) - 1], "^", anzahl[len(liste2) - 1])
"""
#335: Primfaktorzerlegung und Potenzschreibweise
Schreibe eine Methode/Funktion, die jede Integer- Zahl in ihre Primfaktoren zerlegen kann
und das Ergebnis als Array/Liste zurückgibt. Schreibe eine weitere Methode/Funktion, die
die Werte des Arrays in Potenzschreibweise überführt und auf dem Bildschirm ausgibt.
"""
import collections
def prf_prim(ein):
print("Ergebnis für die Zahl", ein)
prim_arr = []
di = 2
while di ** 2 <= ein:
while (ein % di) == 0:
prim_arr.append(di)
ein //= di
di += 1
if ein > 1:
prim_arr.append(ein)
print(prim_arr)
for (basis, hochz) in collections.Counter(prim_arr).items():
print(basis, "**", hochz)
def main():
prf_prim(24)
prf_prim(0)
prf_prim(105)
if __name__ == '__main__':
main()
from sympy import isprime
from functools import lru_cache
def primeFact(n):
# Rekursive Berechnung der Primfaktoren
# Deklarator @lru_cache wird verwendet, um bereits
# berechnete Werte zu cachen und Funktionsaufrufe zu sparen
@lru_cache(maxsize=None)
def recFact(n):
if isprime(n):
return [n]
else:
a = 2
while n % a != 0:
a += 1
b = n // a
return [recFact(a), recFact(b)]
# x-dimensionale Liste in 1-dimensionale Liste umwandeln
fact_list = []
def flatten(input_list):
for element in input_list:
if type(element) == list:
flatten(element)
else:
fact_list.append(element)
flatten(recFact(n))
return fact_list
def createOutput(fact_list):
fact_list.sort()
fact_dict = {}
output_str = ""
superscript = str.maketrans("0123456789", "⁰¹²³⁴⁵⁶⁷⁸⁹")
for i in fact_list:
fact_dict[i] = str(fact_list.count(i)).translate(superscript)
for i in fact_dict:
output_str += f"{i}{fact_dict[i]} * "
return output_str[:-3]
# Test
n = 987
print(f"Die kanonische Primfaktorzerlegung von {n} lautet:")
print(f"{n} = {createOutput(primeFact(n))}")
prim = [2]
ar = []
def primCalculation(end):
for i in range(3, end):
a = 2
isPrimCount = 0
noPrimCount = 0
while a < i:
rest = i % a
if rest != 0:
a = a + 1
isPrimCount = isPrimCount + 1
else:
noPrimCount = noPrimCount + 1
a = a + 1
if noPrimCount == 0 and isPrimCount > 0:
prim.append(i)
def divide(number):
primCalculation(number)
y = 0
for i in prim:
next = False
stop = False
while type(y) == int and next is False and stop is False:
y = number / i
if str(y).endswith('.0') and stop is False:
ar.append(i)
y = int(y)
number = y
next = False
if i > y:
stop = True
else:
y = y * i
y = int(y)
next = True
print(ar) # 1. Ausgabe
potenz() # 2. Ausgabe
def potenz():
inhalt = []
finalString = ''
for i in ar:
if i not in inhalt:
inhalt.append(i)
for i in inhalt:
if ar.count(i) > 1:
if finalString == '':
finalString += str(i) + ' ^ ' + str(ar.count(i))
else:
finalString += ' + ' + str(i) + ' ^ ' + str(ar.count(i))
else:
if finalString == '':
finalString += str(i) + ' ^ 1'
else:
finalString += ' + ' + str(i) + ' ^ 1'
print(finalString)
divide(50)
