Une fraction unitaire est une fraction dont la molécule est 1. La fraction unitaire dont le dénominateur est 2 à 10 est exprimée en décimal comme suit.
1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6) 1/7 = 0.(142857) 1/8 = 0.125 1/9 = 0.(1) 1/10 = 0.1
0.1 (6) est le nombre 0.166666 ... et a un nœud circulaire à un chiffre. Un nœud circulaire 1/7 a six chiffres.
Trouvez d tel que le nœud circulaire de la partie fractionnaire est le plus long en 1 / d où d <1000. http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2026
(1) La longueur du nœud circulaire de la partie fractionnaire de 1 / d est le point où d est le minimum n qui divise 10 ^ n-1. (2) Des facteurs tels que 2, 5 ne contribuent pas à la longueur de la théorie circulaire de la partie fractionnaire. J'ai écrit le code suivant en partant de ces deux points (voir supplément). Puisque les trois points de get_prime_boolean et get_prime_listm get_primes sont stockés dans mymath, vous pouvez vous y référer.
def get_prime_boolean(max):
    bool = [False,False]+[True]*(max-1)
    bool[4::2] = [False] * (len(bool[4::2]))
    p = 3
    p_max = int(math.sqrt(max))+1
    while p<=p_max:
        if bool[p]:
          bool[p*2::p] = [False] * (len(bool[p*2::p]))
        p+=2
    return bool
def get_prime_list(bool):
    length = len(bool)
    return [i for i in range(2,length) if bool[i]]
def get_primes(max):
    bool = get_prime_boolean(max)
    list = get_prime_list(bool)
    return {'bool':bool,'list':list}
def pe26():
  MAX = 1000
  seq = range(MAX)
  ans = seq[3::10] + seq[7::10] + seq[9::10] + seq[11::10]
  t = 9
  while len(ans) > 1:
    i = 0
    while i < len(ans):
      if (t%ans[i]) == 0:
        ans.pop(i)
      else:
        i += 1
    t = t*10 + 9
  print ans[0]
  import math
  print math.log(t,10)
pe26()
        Recommended Posts