\$\begingroup\$
\$\endgroup\$
I'm back with a Python solution for Project Euler 35. Any help would be appreciated; I generate the numbers by observing that all circular primes can only have digits 1, 3, 7, and 9. Then I use the Cartesian product built into itertools. I also have a local primes test from Wikipedia.
from primes import test as is_prime
from itertools import product # cartesian product
from timeit import default_timer as timer
def find_circular_primes_under(limit):
def is_circular(digits):
digits = list(digits)
for digit in digits:
if not is_prime(int(''.join(map(str, digits)))):
return False
else:
digits.append(digits.pop(0))
return True
if type(limit) != int or limit <= 2:
return "Error: primes are positive integers greater than 1."
elif limit <= 11:
sum = 0
for k in range(limit):
if is_prime(k):
sum += 1
return sum
else:
sum = 4
for k in range(2, len(str(limit))):
for combo in product([1, 3, 7, 9], repeat = k):
if is_circular(combo):
sum += 1
return sum
start = timer()
ans = find_circular_primes_under(10**6)
elapsed_time = (timer() - start) * 1000 # s --> ms
print "Found %d in %r ms." % (ans, elapsed_time)
1 Answer 1
\$\begingroup\$
\$\endgroup\$
- Returning an error message instead of data is not a good approach to handling errors. Try and see what happens if you tweak your code to pass an invalid argument to
find_circular_primes_under
. Do you see your error message? No, the program raises an exception trying to format the return value as a number. It would be better to raise an appropriate exception instead of returning from the function. - Modifying a container while iterating over it causes undefined behavior. In
is_circular
you could usefor _ in xrange(len(digits)):
instead offor digit in digits:
to be safe. Thedigit
variable is not used anyway. - You could take advantage of
collections.deque
and itsrotate
method to produce the rotations.
answered Apr 30, 2014 at 15:34
Explore related questions
See similar questions with these tags.
lang-py