#!/usr/bin/env python # -*- coding: utf-8 -*- """ project euler problem 41 n桁の数がPandigitalであるとは, 1からnまでの数を各桁に1つずつもつことである. 例えば2143は4桁のPandigital数であり, かつ素数である. n桁のPandigitalな素数の中で最大の数を答えよ. """ import Euler import time time1 = time.time() answer = 0 for i in range(9999999, 1000000, -1): if Euler.pandigital_check(i) * Euler.primecheck(i): answer = i break if answer == 0: for i in range(9999, 1000, -1): if Euler.pandigital_check(i) * Euler.primecheck(i): answer = i break print(answer) print(time.time() - time1, "seconds")
渦巻きに新しい層を付け加えよう. すると辺の長さが9の渦巻きが出来る. 以下, この操作を繰り返していく. 対角線上の素数の割合が10%未満に落ちる最初の辺の長さを求めよ. """ import time import math import Euler time1 = time.time() amount = 0 p_amount = 0 c = 0 add_count = 0 add_num = 2 i = 1 while True: if amount != 0 and math.sqrt(i) % 1 == 0 and int(math.sqrt(i)) % 2 == 1: if p_amount * 10 <= amount: break if add_count == 4: add_count = 0 add_num += 2 i += add_num add_count += 1 amount += 1 if Euler.primecheck(i): p_amount += 1 print(math.sqrt(i), i) print(time.time() - time1, "Seconds")
3797は面白い性質を持っている. まずそれ自身が素数であり, 左から右に桁を除いたときに全て素数になっている (3797, 797, 97, 7). 同様に右から左に桁を除いたときも全て素数である (3797, 379, 37, 3). 右から切り詰めても左から切り詰めても素数になるような素数は11個しかない. 総和を求めよ. 注: 2, 3, 5, 7を切り詰め可能な素数とは考えない. """ import time import Euler time1 = time.time() anslist = [] i = 9 while len(anslist) < 11: i += 2 if Euler.primecheck(i) == 0: continue checkn = 1 for j in range(1, len(str(i))): if Euler.primecheck(int(str(i)[j:])) * Euler.primecheck(int(str(i)[:j])) != 1: checkn = 0 break if checkn == 0: continue if j == len(str(i)) - 1: anslist.append(i) print(sum(anslist)) print(time.time() - time1, "seconds")