标签:
题目1:给定一个整数N,那么N的阶乘N!末尾有几个0呢?ret=0; for(i=1;i<=N;i++) { j=i; while(j % 5==0) { ret++; j/=5; } }由上可看出,循环中有许多不要的步骤,因为只需要求5的指数个数即可,上述还可以改进如下:
ret=0; for(i=1;i<=N;i*=5) { j=i; while(j % 5==0) { ret++; j/=5; } }方案二解法如下;Z=[N/5]+[N/5^2]+[N/5^3]+....(公式中[N/5]表示不大于N的数中5的倍数贡献一个)。
ret=0; while(N) { ret+=N/5; N/=5; }题目2:求N!的二进制中最低位1的位置。
int lowestOne(int N) { int Ret=0; while(N) { N>>1; Ret+=N; } return Ret+1; }方案二:这里我们还可以根据N减去N的二进制中1的数目这个规律来求解。
int count(int n)//统计1的个数; { int Ret=0; while( n ) { Ret++; n= n&(n-1); } return Ret; } int FindLowestOne(int num)//num中最低位1的位置; { return num-count(num)+1; }相关题目;给定整数n,判断它是否为2的方幂。
if(n & (n-1))==0)
标签:
原文地址:http://blog.csdn.net/gogokongyin/article/details/51871692