引き続きProject Euler
引き続き Project Euler を解いています。
なんだか時間を浪費しているように思えてならないのですが、なぜか魅力があります。
Project Euler 30
http://odz.sakura.ne.jp/projecteuler/index.php?Problem%2030
この問題、単純に計算する範囲を絞るだけの問題なのですが、各桁の5乗和が大きいように思えて範囲を絞れることになかなか気づきませんでした。。。
冷静に考えると桁を1つ上げると、数字は10倍、各桁の5乗和は高々9^5の増加ですよね。数字が大きくなると、10倍の方が増加分が大きくなるということなんですよね。
数学が久しぶりすぎてこんな簡単なことに気づくのに時間がかかってしまいましたorz
各桁を配列化する
各桁の合計を求めたりするのに、各桁の配列化をよく行うのですが、今まで手抜きで
def digits(num) num.to_s.split("").map{|t|t.to_i} end
としていました。
しかし、splitがあまりに遅すぎるため、普通に数値だけで求めることにしました。
def digits(num) res = [] while num != 0 res << num % 10 num /= 10 end return res end
ちなみに、時間の違いを測定したところ、1000000回試行して、それぞれ 20s, 3s でした。
10倍くらいということであれば、劇的な速度向上というわけではないですね。ただ、コンソールの前で待つ時間が減ったというよい効果があります。