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

プログラミングする数学信者

数学信者が数学とプログラミングの話題を中心にして何か書きます

POH7「プログラミングで彼女をつくる」水着ゲットチャレンジ

Ruby プログラミング

paizaオンラインハッカソン vol.7 「プログラミングで彼女をつくる」というプログラミングで遊ぶイベントがありました。
paiza.jp

そこの水着ゲットチャレンジで正解した自分のコードを載せます。試行錯誤の末辿り着いたものなので、自分でもわからない部分がありますが…

問題はこちらです。

N が与えられたとき、N! のすべての桁の代わりに、N! の最下位桁から続く0 をすべて除いた値の下位9桁を求めるプログラムを作成してください。
9桁ではあるが先頭が0であるような場合は先頭の0を取り除いた値を出力してください。先頭に0のついた値を出力すると誤答となります。


自分の解答方針は次の通りです。

  • 掛ける前に掛ける数を10で割れるとこまで割る
  • 掛けた結果も10で割れるとこまで割る
  • 上記2つを行った後、下位の桁だけ残す

これを基にして作ったコードが以下のようになります。言語はRubyです。コメントの部分は、自分でもよくわかっていない部分です。

n = gets.to_i
kaijo = 1
# 1.upto(n)ではダメ
n.downto(1) do |i|
  i2 = i
  while i2%10 == 0
      i2 /= 10
  end
  kaijo *= i2
  while kaijo%10 == 0
      kaijo /= 10
  end
  # 10**9 ではダメ
  kaijo %= 10**10
end
kaijo %= 10**9
puts kaijo