题意:将N!转成十六进制,除去前导0之后,问剩下的数字里面有多少个0。
由于N<=100,所以可以直接写个高精度预处理它,打表秒杀!
要注意数组还是要开大些,十六进制的100!长度也可达到130+。
另外一个注意点是0!= 1,不要漏了。
#include<cstdio>
#include<cstring>
struct BigInt{
int x[200];
BigInt(){}
BigInt(int n){
memset(x, 0, sizeof(x));
for(int i=0; n; i++,n>>=4){
x[i] = n&15;
}
}
void mul(int n){
for(int i=0; i<200; i++){
x[i] *= n;
}
for(int i=0; i<199; i++){
x[i+1] += (x[i]>>4);//等价于除以16
x[i]&=15;//等价于模16
}
}
int count(){
int i;
for(i=199; i>0; i--){
if(x[i]) break;//除去前导0
}
int cnt = 0;
for(i; i>=0; i--){
if(!x[i]) cnt++;
}
return cnt;
}
};
int ans[110];
void init(){
BigInt A = BigInt(1);
ans[0] = 0;
for(int i=1; i<=100; i++){
A.mul(i);
ans[i] = A.count();
}
}
int main(){
init();
int n;
while(~scanf("%d", &n) && n>=0){
printf("%d\n", ans[n]);
}
return 0;
}