いかにもロジカルな問題。
ぶっちゃけ解けなかった。。。
10で何回割れるかっていうことかなとまではわかったけど。
N = int(input())
sum = 1
for i in range(N):
sum *= i + 1
cnt = 0
while sum > 0:
if sum % 10 == 0:
sum //= 10
cnt += 1
else:
sum //= 10
print(cnt)
かすりもしませんでした。
これを読んで割り切れるか割り切れないかって
素因数分解の話だよって言われて、おお、、、数学。。。
と思いました。(ちなみに著者は数学苦手な典型的な文系)
とはいえ、プログラマとしては逃げるわけにはいかないので。
まあ。とりあえず素因数分解をしてみる。
ひとまず5の階乗ということにしてみよう。
5 * 4 * 3 * 2 * 1 = 120。
つまり5の階乗は120で、0は1つですね。
素因数分解。。。とかんがえたけど
けっきょくこれって階乗を使ってそのまま分解すればいいかな。
5 * (2 * 2) * 3 * 2 * 1
こういうことですよね。
で、5は1回しか出てこないので0は一つ。
ではそれより下の4の階乗ならどうか。
4 * 3 * 2 * 1 = 24ですね。
素因数分解しても
(2 * 2 ) * 3 * 2 * 1 = 24
何をどうしても0はできません。
では6の階乗は。
6 * 5 * 4 * 3 * 2 * 1 =
(3 * 2 ) * 5 * (2 * 2) * 3 * 2 * 1
=720
これも5が1つだけなので、0は1つ。
では7の階乗は。
7 * 6 * 5 * 4 * 3 * 2 * 1 =
7 * (3 * 2 ) * 5 * (2 * 2) * 3 * 2 * 1
=1440
これも5が1つだけなので、0は1つ。
どうやら、5が1つだけしかなければ0も1つだけ、というパターンが見えてきました。
では10!。(8!も9!も5が1つなので絶対に0は1つだけでした)
計算面倒なので途中までやりますね
10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
= (5 * 2) * (3 * 3) * (2 * 2 * 2 ) * 7 * (3 * 2 ) * 5 * (2 * 2) * 3 * 2 * 1
= 720 * 1440 (つまり10〜8と、7〜1をかけたもの)
0、あきらかにそれぞれ1つありますね。だから0が2つになるはずです。
5も2つ。
つまり5で何回割れるか?が答えということになるんだね。
とりあえず10の階乗の例で、
まず10を5で割ると2。
この2をさらに5で割る。0あまり。なので結局2個というのが答え。
別の問題で、たとえば
10を2で何回割れるか?が答えになるとすると、
10を2で割ると5。
5をさらに2で割ると2あまり
2をさらに2で割ると 1。
だから、この問題は各商を足し合わせた
5+2+1の8個あることになる。
5で何回割れるかのところも、商だけで2個なので問題なし。
ロジックが理解できたところで本題
N = int(input())
cnt = 0
while N > 0:
#商を足し合わせ
cnt += N // 5
N //= 5
print(cnt)
ふー。勉強になりました。。。
とはいえ、ロジックというかパターンを読み解くなら
プログラムを書く前にどんなロジックになっているのかみる力を身に着けねばです。