Python :: Aufgabe #335

5 Lösungen Lösungen öffentlich

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ß

Lösungen:

vote_ok
von AlexGroeg (2010 Punkte) - 06.04.2021 um 17:56 Uhr
Quellcode ausblenden Python-Code

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)

vote_ok
von satn1241 (3090 Punkte) - 07.04.2021 um 11:39 Uhr
Quellcode ausblenden Python-Code
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])
vote_ok
von eisheiliger (3750 Punkte) - 07.04.2021 um 17:37 Uhr
Quellcode ausblenden Python-Code

"""
#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()


vote_ok
von nitnat (670 Punkte) - 09.04.2021 um 18:55 Uhr
Quellcode ausblenden Python-Code
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))}")

vote_ok
von vMaex (540 Punkte) - 19.04.2021 um 16:09 Uhr
Quellcode ausblenden Python-Code
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)
2118389

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.