Problem 35 von Project Euler ist wie so:Python - Projekt Euler # 35 - was ist los mit diesem Ansatz?
Die Zahl 197 ist eine kreisförmige prime, da alle Drehungen der Ziffern genannt: 197, 971 und 719, sie prim sind.
Es ist dreizehn solche Primzahlen unter 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79 und 97.
Wie viele kreisförmigen Primzahlen sind unter eine Million?
My, eher grob, ist Ansatz zunächst unter einer Million dann alle Primzahlen erzeugen alle Primzahlen auszufiltern, die auch Ziffern enthalten oder die Nummer 5 (wie es immer eine nicht-prime Permutation). Dann, für jedes Element in dieser reduzierten Liste von Primzahlen, um alle möglichen Permutationen der Zahl unter Verwendung der permutations() - Funktion in dem Iterool-Modul zurückzugeben, dann um zu überprüfen, ob irgendwelche dieser Permutationen nicht Primzahlen sind und wenn ja, um das Element zu entfernen die Liste der Primzahlen.
from itertools import permutations
def gen_primes(limit):
D = {}
q = 2
while q <= limit:
if q not in D:
yield q
D[q * q] = [q]
else:
for p in D[q]:
D.setdefault(p + q, []).append(p)
del D[q]
q += 1
def odd_primes(limit):
r = list(gen_primes(limit))
for i in r[:]:
for j in str(i):
if any(int(j)%2 == 0 or int(j) == 5 for j in str(i)):
r.remove(i)
break
r.extend([2,5])
return r
def circular_list():
prime_list = odd_primes(1000000)
for i in prime_list[:]:
perm = [''.join(j) for j in permutations(str(i))]
if any(int(j) not in prime_list for j in perm):
prime_list.remove(i)
break
return prime_list
print len(circular_list)
Die Ausgabe ergibt einen Wert, der mit einem gewissen Abstand falsch ist. Ich habe wirklich versucht, den Fehler in der Logik oder im Code (oder beiden) zu finden. Ist die Funktion permutations() ein praktikabler Ansatz?
Ich verstehe, dass es effizientere Ansätze gibt, aber ich wäre dankbar, wenn mir jemand in eine Richtung zeigen könnte, damit dieses funktioniert.
Nicht alle Permutationen sind Rotationen. – jwodder
Wissen Sie, dass 'gen_primes' tatsächlich das tut, was auf der Verpackung steht? Auch Ihr Code in "odd_primes" sieht für mich seltsam aus ... ich denke, dass es versucht, Primzahlen aus der Liste zu entfernen, die entweder eine 2 oder eine 5 haben - ein schnellerer Weg könnte sein, "in" zu verwenden (d. H.'if '2' in str (i) oder" 5 "in str (i)') –