int FactorialZeroNum1(int N)
{//N!末尾有多少个0,求1..N各个数的5的因子有多少个
int ret = 0;
for(int i = 1 ; i <= N ; ++i)
{
int j = i;
while( j % 5 == 0)
{
ret++;
j /= 5;
}
}
return ret;
}
int FactorialZeroNum2(int N)
{//N!末尾有多少个0,求Z = [N/5] + [N/5^2] + [N/5^3]+ ...
int ret = 0;
while( N )
{
ret += N / 5;
N /= 5;
}
return ret;
}
int FactorialLast1Position(int N)
{//求N!中最后一个1的位置,等于求N!中含有质因数2的个数即[N/2] + [N/4] + [N/8]....
int ret = 0;
while( N )
{
N >>= 1;
ret += N;
}
return ret+1;
}
int FactorialLast2Position(int N)
{//求N!中最后一个1的位置,等于N - N的二进制表示中1的个数
int ret = N;
int numof1 = 0;
while( N )
{//求N的二进制表示中1的个数
if(N&0x01)
numof1++;
N >>= 1;
}
return ret - numof1 + 1;
}