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

PEをMathematicaで

Project Eulerに挑戦してみよう

Project Euler 80 / 平方根の10進展開

よく知られているように自然数の平方根が整数ではないならば,それは無理数である。そのような平方根の10進展開(decimal expansion)は繰り返しを持たない無限小数になる。

2の平方根は 1.41421356237309504880... であり,その頭から100桁の数字を合計すると475になる。

初めの100個の自然数の平方根のうち無理数について,それぞれの頭から100桁の数字を足した数の総和を求めよ。

Problem 80 - Project Euler


問題文が若干不明確なのですが,√2の例で確かめてみたところ「頭から100桁の数字」は整数部分を含むようです。

N[Sqrt[2], 100] などで100桁求めてその総和を求めてみたところ,不正解…… 四捨五入で最後の数字が変わるケースがあるためです。そこで,

  1. N[Sqrt[], 101] で101桁まで求める
  2. 10^99倍して Floor[] で101桁目を切り捨てる

で対処しました。一応,9がズラッと並ぶケースなんてのも考えられるので数学的に正しい解ではありませんが,流石にこういうことはあまりないのではないかと思います。うまい方法を見つけたら,後で直します。

「平方根が整数でない」は Complement[] を使って Range[100] から平方数を除くことで対処しましたが,一旦和を求めてから 1+2+…+9+1 を引いてもいいですね。