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

题目: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[n]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值