Project Euler[26-50]

26、

#encoding=utf-8
”’
而怎么计算一个数的循环长度呢
只需要知道它能被多少长度的9整除就行了
3能被9整除,所以它的循环长度是1
7能被999999整除,商正好是循环体142857,所以它的循环长度是6
”’
from euler import is_prime

n = 997
for p in range(n, 1, -2):
    if not is_prime(p):
        continue
    c = 1
    while (pow(10, c) – 1) % p != 0:
        c += 1
    if p-c == 1:
        break
print p

27、

#encoding=utf-8
from euler import is_prime

def get_primes_num(a, b):
    n = 0
    while 1:
        value = n*n + a*n +b
        if value <= 0:
            break
        if not is_prime(value):
            break
        n += 1
    return n

#print get_primes_num(-79, 1601)
”’
b一定是正素数
因为当n为0时,表达式的值为b
”’
primes_b = []
for i in range(3, 1000):
    if is_prime(i):
        primes_b.append(i)

solution = ()
snum = 0
for a in range(-999, 1000):
    for b in primes_b:
        gpnum = get_primes_num(a, b)
        if gpnum > snum:
            solution = (a, b)
            snum = gpnum
            print solution, gpnum, solution[0] * solution[1]

28、

#encoding=utf-8

numbers_sum = 1
corder_sum = 1
circle_num = (1001 + 1) / 2   #2n-1等于边长,n为圈数
for circle in range(2, circle_num+1):
    numbers_sum = (2 * (circle-1) – 1)**2
    first_num = numbers_sum + 1 #这一圈的第一个数
    step = 2*circle – 2  #边长-1
    first_corder = first_num + step – 1
    corder_sum += first_corder*4 + step*6

print corder_sum

29、

result = set()
for a in range(2, 101):
    for b in range(2, 101):
        result.add(a**b)

print len(result)

30、

resultsum = []

for num in range(2, 9**5*7):
    tmpsum = 0
    for i in str(num):
        tmpsum += int(i)**5
    if tmpsum == num:
        resultsum.append(tmpsum)
print resultsum
print sum(resultsum)

31、

#encodin=utf-8
target = 200
coins = [1,2,5,10,20,50,100,200]
ways = [1]+[0]*target
”’
动态归划问题
”’
for coin in coins:
   for i in range(coin, target+1):
       ways[i] += ways[i-coin]
print ways[target]

32、

pandigitals = set()
for multiplicard in range(1, 5001):
    for multiplier in range(1, 101):
        product = multiplicard * multiplier
        ss = str(product)+str(multiplicard)+str(multiplier)
        ss = ”.join(sorted(ss))
        if ss == ’123456789′:
            print product
            pandigitals.add(product)

print sum(pandigitals)

33、

d = 1
for i in range(1, 10):
  for j in range(1, i):
    for k in range(1, j):
      ki = k*10 + i
      ij = float(i)*10 + j
      if (k*ij == ki*j):
        d *= ij/ki
print d

34、

fact = (1,1,2,6,24,120,720,5040,40320,362880)
s = 0

for n in range(10, 50000):
    x = sum( fact[int(d)] for d in str(n) )
    if n == x:
        s += n
print s

35、

import math
total=1

def prime(n):
    if(n==2):
        return True
    if(not n%2):
        return False
    else:
        for i in range(3,int(math.sqrt(n))+1,2):
            if(not n%i):
                return False
    return True

def rotate(l):
    l.insert(0,l.pop())
    return (check(l))

def check(l):
    n=0
    for k in l:
        n=n*10+int(k)
    if(prime(n)):
        return True
    return False

for i in range(3,1000000,2):
    flag=True
    evenflag=False
    even=[2,4,6,8,0]
    l=list(str(i))
    for k in even:
        if(str(k) in l):
            evenflag=True
            break;
    if(evenflag):
        continue
    for k in range(len(l)):
        if(not rotate(l)):
            flag=False
            break
    if(flag):
        total+=1
print total

36、

result = 0
for i in range(1, 1000001):
    if str(i) == str(i)[::-1]:
        b = str(bin(i))[2:]
        if b == b[::-1]:
            #print i, b
            result += i
print result

37、

from euler import is_prime
from math import log10

primes = [23,37,53,73,313,317,373,797,3137,3797,7937,31397,31973,37313,37397,71317,
71713,71917,73973,79397,313717,317197,319313,371737,371797,373717,373937,
379397,713737,713917,717317,717397,717917,719197,719713,719717,731713,
731737,739373,739397,791317,791797,793717,797917]

def trunc(n):
  c = n
  while c>10:
    c = c % ( 10**(int(log10(c))) )
    n = n//10
    if not is_prime(c) or not is_prime(n): return False
  return True

c = 0
s = 0
for p in primes:
  if trunc(p):
    print p
    c += 1
    s += p

print c,"primes found for a sum of",s

38、

def f1(n):
    strNum = str(n)
    for i in range(1,5):
        tmpStr = strNum
        num = int(strNum[:i])
        index = 1
        flag = False
        while True:
            str1 = str(num*index)
            len1 = len(str1)
            if str1 == tmpStr[:len1]:
                if len(tmpStr)>len1:
                    tmpStr=tmpStr[len1:]
                elif len(tmpStr) == len1:
                    flag = True
                    break
            else:
                break
            index += 1
        if flag:
            return True
    return False

numList=[1,['','12345678']]
while True:
    if numList[0]==40320:
    #8!=362880
        break
    for i in range(1,numList[0]+1):
        left = numList[i][0]
        right= numList[i][1]
        l = left+right[0]
        r = right.replace(right[0],”)
        numList[i] = [l,r]
        for j in right[1:]:
            l = left+j
            r = right.replace(j,”)
            numList.append([l,r])
            numList[0] += 1
numStrList = []
for i in numList[1:]:
    numStrList.append(’9′+i[0]+i[1])
del numList
# print numStrList
# print len(numStrList)
result = 0
for i in numStrList:
    if f1(int(i)):
        if int(i) > result:
            result = int(i)
print result

39、

t_max = 0
p_limit = 1000

for p in range(p_limit//2, p_limit+1, 2):
  t = 0;
  for a in range(2, p/4+1):
    if  p*(p – 2*a) % (2*(p-a)) == 0: t += 1
    if t > t_max: (t_max, p_max) = (t, p)

print p_max

40、

num = 0
strs = ”
count = 0
while count < 1000001:
    l = len(str(num))
    count += l
    strs += str(num)
    num += 1

ss = 1
for i in range(7):
    ss *= int( strs[10**i] )
print ss

41、

from euler import is_prime, is_pandigital
”’
any integer is divisible by 3 or 9 whose sum of digits is divisible by 3 or 9; therefore composite and not prime.

9+8+7+6+5+4+3+2+1 = 45,
8+7+6+5+4+3+2+1 = 36,
6+5+4+3+2+1 = 21, and
5+4+3+2+1 = 15,
all of which are divisible by 3 and therefore could not yield a 1 to {5, 6, 8, 9} pandigital prime. So that leaves 4 and 7 digit prime numbers less than 4321 and 7654321 respectively.

”’

n = 7654321
while not(is_prime(n) and is_pandigital(str(n), 7)):
    n -= 2
print n

42、

import urllib

words = urllib.urlopen(‘http://projecteuler.net/project/words.txt’).read()
wordslist = [ w[1:-1] for w in words.split(‘,’) ]
tri_numbers = []
n = 1
while n*(n+1) / 2 <= 260:
    tri_numbers.append(n*(n+1)/2)
    n += 1
result = 0
for word in wordslist:
    v = 0
    for w in word:
        v += ord(w)-ord(‘A’)+1
    if v in tri_numbers:
        result += 1

print result

43、

import itertools
#here is a better and faster way: http://blog.dreamshire.com/2009/04/28/project-euler-problem-43-solution/
iter_list = itertools.permutations(range(10))
result_sum = 0
divs = [2,3,5,7,11,13,17]
for number in iter_list:
    if number[0] == 0: continue
    number_str = ”.join([str(n) for n in number])
    isok = True
    for i in range(len(divs)):
        if int(number_str[i+1: i+4]) % divs[i] != 0:
            isok = False
            break
    if isok:
        result_sum += int(number_str)
print result_sum

44、

pent = set( n * (3*n – 1) / 2 for n in range(2,2400) )

def pe44():
  for pj in pent:
    for pk in pent:
      if pj – pk in pent and pj + pk in pent:
        return pj – pk

print pe44()

45、

#encoding=utf8
from math import sqrt
”’
Note that Hexagonal numbers are a subset of Triangle numbers so we only determine the first occurrence of Hi = Pj to find our answer. We can safely start our search from 144 as alluded from the problem’s description.
”’
def is_pentagonal(n):
       p = (sqrt(1 + 24*n) + 1) / 6
       return p==int(p)
h = lambda n: n*(2*n – 1) #calculate the nth hexagonal number
n = 144
while not(is_pentagonal(h(n))): n += 1
print h(n)

46、

n = 5
f = 1
primes = set()

while (1):
  if all( n % p for p in primes ):
    primes.add(n)
  else:
    if not any( (n-2*i*i) in primes for i in range(1, n) ):
      break
  n += 3-f
  f = -f
print n

47、

from euler import factor
# the euler module can find here : http://blog.dreamshire.com/2009/03/26/94/
ci = 1
nf = 4        #number of distinct factors
ns = 4        #number of consecutive integers
n = 2*3*5*7    #starting candidate for search
while ci != ns:
  n += 1
  if len(factor(n)) == nf: ci += 1
  else: ci = 0

print "Answer to PE47 = ", n-nf+1

48、

result = 0
for i in range(1, 1001):
    result += i**i
print str(result)[-10:]

49、

from euler import is_prime, is_perm

n = 1489     # must be odd
while True:
  b, c = n+3330, n+6660
  if is_prime(n) and is_prime(b) and is_prime(c) \
    and is_perm(n,b) and is_perm(b,c): break
  n += 2

print "Answer to PE49 = ", str(n)+str(b)+str(c)

50、

from euler import prime_sieve, is_prime

max = 1000000
primes = prime_sieve(max)
prime_sum = [0]

sum = 0
count = 0
while(sum < max):
    sum += primes[count]
    prime_sum.append(sum)
    count += 1

terms = 1
for i in range(count):
    for j in range(i+terms, count):
        n = prime_sum[j] – prime_sum[i]
        if j-i > terms and is_prime(n):
            terms, max_prime = j-i, n
print max_prime