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

来源:互联网 发布:翼龙贷java 待遇 编辑:程序博客网 时间:2024/06/05 18:40

题目: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;}


0 0
原创粉丝点击