読者です 読者をやめる 読者になる 読者になる

PEをMathematicaで

Project Eulerに挑戦してみよう

Project Euler 43 / 部分文字列被整除性

数1406357289は0から9のパンデジタル数である(0から9が一度ずつあらわれる数)。この数は部分文字列が面白い性質を持っている。

d1を上位1桁目,d2を上位2桁目の数とし,以下順にdnを定義する。この記法を用いると次のことが分かる。

  • d2d3d4=406 は 2 で割り切れる
  • d3d4d5=063 は 3 で割り切れる
  • d4d5d6=635 は 5 で割り切れる
  • d5d6d7=357 は 7 で割り切れる
  • d6d7d8=572 は 11 で割り切れる
  • d7d8d9=728 は 13 で割り切れる
  • d8d9d10=289 は 17 で割り切れる

このような性質をもつ0から9のパンデジタル数の総和を求めよ。

Problem 43 - Project Euler


パンデジタル数は Permutations[Range[0, 9]] で作ります。これで {0,1,...,9} を並べ替えたすべてのリストができます。

その後の処理はこうです。

  1. Take[x, {i + 1, i + 3}]でリスト x の i+1 桁目から i+3 桁目までを取り出す
  2. FromDigits で数に直す
  3. i 番目の素数 Prime[i] で割り切れるかどうかを Divisible で調べる
  4. チェックを通ったリストを FromDigits で数に直して,その和を求める


ちなみに条件をみたす数は6個でした。これは首位の数字が0の数を含めても変わりません。