Sum of Factorials(3)
楽しい作業
前回のコードは超長〜いので、ガシガシ削っていくことにする。
ポイントはn=0の場合と、0!の扱いだ。n=0の場合はもっと短く出来るが、とりあえず前回のコードの形を変えたくないのでこのように書いてみた。
終了判定の前に減算すれば、2/2=1と1/1=1で1を2回引いてくれるわけだから、条件分岐は不必要だ。これでかなりスッキリする。あとは細かい部分を削っていけば最短コードが完成する。
main(){
int n,i,k;for(;scanf("%d",&n),n>=0;){
n||--n;//nが0の時は1を引いておく。これでNOになるだろう。
for(i=9,k=362880;(n-=n<k?0:k)&&i>0;)k/=i--;
//終了判定と減算処理を一緒にすれば、0!の場合を考えなくて済むputs(n?"NO":"YES");
}
}