CodeIQ の カット・アンド・スクエア問題 をやってみたので、自分なりの解き方を書いてみます。
ある数を上 n/2 桁と下 n/2 桁とに分け、それぞれを 2 乗して和をとると、元の数に戻ります。
例えば n = 4 の場合は、1233 と 8833 がこの条件を満たします。
122 + 332 = 1233
882 + 332 = 8833
-
n = 6 の場合にこの条件を満たす数はただ一つ存在します。この数を求めてください。
-
設問 n = 10 の場合にこの条件を満たす全ての数の総和を求めてください。
ある数の上 n/2 桁を x、下 n/2 桁を y とすると、それぞれを 2 乗して和をとると元の数に戻るためには、以下の等式が成り立つ必要があります。
x2 + y2 = x * 10(n/2) + y
この式を変形すると次のようになります。
x * (10(n/2) - x) = y * (y - 1)
右辺は y2 に近いため、範囲内のすべての x に対して左辺の平方根を求め、それを整数化することで y を求め、それが上記の等式を満たすかを調べています。
Ruby で書いたコードを添付します。ideone.com に 実際に動作するもの があります。