【ループメニュー2】> 【約数の列挙】STEP: 10 階乗の末尾に 0 はいくつ付く? (paizaランク C 相当) [難易度: 1448 ±28]
※リンク先へ移動するためには[paiza]へのログインが必要です。
整数 N が与えられます。
N の階乗 N!
の末尾に 0 がいくつ付くか求め、出力してください。
入力値(例)
100
出力値(例)
24
解答例
1 2 3 4 5 6 7 8 9 10 11 |
<?php $n = trim(fgets(STDIN)); $i = 1; $zero = 0; while($i < 5) { $zero += $n / (5 ** $i); $i++; } echo floor($zero); ?> |
解説
階乗とは、1からある数までの連続する整数の積のことです。
整数5の場合、
5! = 5*4*3*2*1 = 120 となります。
階乗の表(外部リンク)を見ると、5!以降は末尾に0が付くようになります。
そしてその法則は以下のようになります。
①末尾に並ぶ0の個数はn!におけるnが5の倍数のときその直前より増える。
②5の倍数からその4つ先までは0の個数は変化しない。
③5の倍数,たとえば5,10,15,20のときはその直前よりも末尾に並ぶ0の個数が1個だけ多くなるが,25のときはその直前よりも2個だけ多くなる。
④全体を眺めれば,25,50,75,100という5の倍数のとき(青)の階乗における末尾に並ぶ0の個数はその直前よりも2個だけ多くなるが,それ以外の5の倍数(赤)の階乗における末尾に並ぶ0の個数はその直前よりも1個だけ多くなる。
ですので、入力値nを(5**$i)で割り続ければゼロの数が数えられるということです。
【外部リンク】啓林館-アクティブラーニングの一例~階乗の表から学ぶn!の末尾に並ぶ0の個数~
感想
ですので、とか言っていますが、自分でなんでだか分からなくなってしまったので、もう少し考えます。( TДT)ゴメンヨー