Python :: Aufgabe #91

4 Lösungen Lösungen öffentlich

Zahl als Produkt zweier Faktoren ohne 0

Fortgeschrittener - Python von Veigar - 24.11.2015 um 16:33 Uhr
Schreibe ein Programm das dir für jede beliebige Zahl ausgibt ob sie als Produkt zweier natürlicher Zahlen die beide keine "0" enthalten darstellbar ist.

Zum Beispiel:
deinAlgorithmus(10) =True (5*2)
deinAlgorithmus(100)= True (25*4)

Sehe aber bitte davon ab ganz einfach ein Programm zu schreiben das für alle Zahlen die kleiner sind als die zu testende Zahl und die keine Nullen enthält überprüft ob der "Gegenfaktor" (also die Zahl die mit der Zahn multipliziert die gesuchte zahl ergibt) ebenfalls keine 0en enthält weil das Programm für sehr hohe Zahlen (Milliarde+) eine moderate Rechenzeit in Anspruch nehmen soll.

Lösungen:

vote_ok
von hak (980 Punkte) - 10.09.2016 um 18:55 Uhr
Quellcode ausblenden Python-Code
def factors(n):
    # maximal 1 faktor > Wurzel(n), 1*n habe ich mal ausgeschlossen
    return [ [i, n//i] for i in range(2, int(n**0.5)+1) if n % i == 0 ] 
        
def has_non_zero_factors(n) :
    for i,j in factors(n):
        if not '0' in str(i) and not '0' in str(j):
            return True
    return False
vote_ok
von Nachbar (2820 Punkte) - 27.10.2016 um 19:37 Uhr

Zitat:

1000.000.000 dauert 1 Minute 14 Sekunden. Mathematisch wahrscheinlich schlecht gelöst aber mit geht es um das Programmieren und das sollte geklappt haben:


Quellcode ausblenden Python-Code
# -*- coding: utf-8 -*-

def has_zero(zahl):
    tmpString = ""
    zahlString = str(zahl)
    for i in zahlString:
        tmpString = tmpString + i
        if int(tmpString) % 10 == 0:
            return True
    return False
  
def no_zeros_in_product(zahl):
    m1, m2 = 2, 0
    a = []
    b = False
    multiplikatoren = {}
    # Multiplikatoren finden
    while m1 < zahl:
        if zahl % m1 == 0:
            m2 = zahl / m1
            # Wiederholungen ausschließen
            if m2 not in a:
                a.append(m2), a.append(m1)
                # Prüfen ob 0en in Multiplikatoren
                if has_zero(m2) == False and has_zero(m1) == False:
                    multiplikatoren[m1] = m2
                    b = True
        m1 = m1 + 1
    # Ausgabe
    if b == False:
        print "False"
    else:
        print "True"
        for key in multiplikatoren:
            print str(key) + " * " + str(multiplikatoren.get(key))

no_zeros_in_product(1000000)
vote_ok
von ZRX88 (2770 Punkte) - 30.12.2016 um 12:40 Uhr
Der Code erfüllt das gewünschte für kleine Kombinationen...
Wenn die Anzahl der gefundenen Primzahlen klein ist, dann funktioniert der Algo. Bei größeren leider nicht mehr.

Ich bin offen für Tipps wie man die Run Methode eleganter schreiben kann.

Quellcode ausblenden Python-Code
def prime_dist(number):
    result = []
    iterator = 2
    while iterator <= number and number > 1:
        if number % iterator == 0:
            number = number / iterator
            result.append(iterator)
            iterator = 1
        iterator += 1
    if len(result) == 1:
        print('Note that number %d is a primenumber.' % result[0]) 
    return result

def check_numbers(number):
    x=1
    for i in str(number):
        x *= int(i)
    return x 

def check_two_numbers(number1, number2):
    if check_numbers(number1) * check_numbers(number2) > 0:
        print('true, the numbers %(teiler1)d and %(teiler2)d are such that %(teiler1)d*%(teiler2)d = %(number)d and %(teiler1)d and %(teiler2)d dont include a zero' % {'teiler1':number1, 'teiler2': number2, 'number':number1*number2}) 
        exit()

def run(number):
    # if the number itself does not include a zero.
    check_two_numbers(1, number)
    prime = prime_dist(number)
    for zahl in prime:
        check_two_numbers(zahl, number/zahl)
        
    # check if a product of 2 primes already fulfils the condition
            
    for i in range(len(prime)):
        for j in range(i+1,len(prime)):
            check_two_numbers(prime[i]*prime[j], number/prime[i]/prime[j])
    print('false, the program did not found a number which fulfills the needed conditions.')
    
run(101)
    
vote_ok
von satn1241 (3090 Punkte) - 17.06.2020 um 18:28 Uhr
Quellcode ausblenden Python-Code
def primfaktorzerlegung(zahl):
    rest = zahl
    primfaktoren = []
    while rest != 1:
        a = int(rest ** 0.5)
        for j in range(2, a + 1):
            if rest % j == 0:
                primfaktoren += [j]
                rest = int(rest / j)
                break
        else:
            primfaktoren += [rest]
            break
    return primfaktoren


def null_check(zahl):
    zahl = str(zahl)
    for i in zahl:
        if i == "0":
            return True
    else:
        return False


def prim_test(zahl):
    faktoren = primfaktorzerlegung(zahl)
    if len(faktoren) == 1:
        print(f"{zahl} ist Primzahl")
        return False
    else:
        return faktoren


def test(zahl):
    stop = False
    liste = prim_test(zahl)
    laenge = len(liste)
    print(liste)
    while stop == False:
        for i in range(0, laenge):
            if not null_check(liste[i]):
                if not null_check(int(zahl / liste[i])):
                    c = liste[i]
                    d = int(zahl / liste[i])
                    break
                else:
                    return "Ein Teiler enthält eine Null "
        stop = True
    return (c, d)


def ausfuehren(zahl):
    from itertools import combinations
    if prim_test(zahl) == False:
        return None
    else:
        liste = prim_test(zahl)

    laenge = len(liste)
    if laenge == 2:
        return test(zahl)
    else:
        for i in range(2, laenge):
            # Teilmengen der Primteiler
            comb = combinations(prim_test(zahl), i)
            # um duplikate bereinigte Liste der Kombinationen
            kombinationen = list(set(list(comb)))
            for j in range(0, len(kombinationen)):
                produkt = 1
                for k in range(0, i):
                    produkt *= kombinationen[j][k]
                if not null_check(produkt):
                    if not null_check(int(zahl / produkt)):
                        a = produkt
                        b = int(zahl / produkt)
                        return (a, b)


zahl = int(input("Gib die zu testende Zahl ein > "))
print(f"{zahl}: {ausfuehren(zahl)}")