カメヲラボ

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

Sum of Factorials(3)

楽しい作業

前回のコードは超長〜いので、ガシガシ削っていくことにする。
ポイントはn=0の場合と、0!の扱いだ。n=0の場合はもっと短く出来るが、とりあえず前回のコードの形を変えたくないのでこのように書いてみた。


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");
}
}

終了判定の前に減算すれば、2/2=1と1/1=1で1を2回引いてくれるわけだから、条件分岐は不必要だ。これでかなりスッキリする。あとは細かい部分を削っていけば最短コードが完成する。