カメヲラボ

主にプログラミングとお勉強全般について書いてます

Sum of Factorials(1)

悩ましいトコロ

階乗が絡んでくる問題は、大抵の場合事前に計算するよりも
実行時に計算した方が良い。
n!(=a)を求めるには


for(a=1;n;a*=n--);


のように書けるし大したコード量ではないが、最短コードを書くことを考えるとこのfor文が冗長に感じてしまうのだ。かと言ってa[]={1,1,2,6,24,120...}とテーブルを作るとさらにコード量が増えてしまう。


そんなわけで通常は前者の方法で計算するわけだが、この問題ではYES/NOの判定処理と組み合わせることでかなりコード量を減らすことが出来る。9!のみを事前に計算しておき、8,7,6,...とループの中で割っていく。同時にインプットの値から(引くことが出来れば)引けば階乗の計算と判定をまとめて行うことができるだろう。ループを抜けた時にインプットの値が0になっていればYES、そうでなければNOを出力すればよい。


それから、この問題はなかなか最短コード泣かせの条件がある。


①インプットの最終が-1とは限らない(負の数とだけ書いてある)
②インプットが0の時はNOを出力しなければならない。


これらがコードを冗長にしてしまうのだが、とりあえず通るコードを
書いてみることにする。


つづく