Python :: Aufgabe #91
4 Lösungen

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.
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:

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
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:

# -*- 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)
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.
Python-Code
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.

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)

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)}")