您的位置:首页 > 其它

HDU 2940 Hex Factorial(高精度,打表)

2014-10-08 17:39 274 查看
题目:Hex Factorial

题意:将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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: