阶乘问题:
1 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=326800,n!的末尾有两个0。
2求N!的二进制表示中最低位1的位置。w
问题1的解法一
质因数分解:N!=2X*3Y*5Z....,由于10=2X5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M=min(X,Z).由于被2整除的概率大,所以M=Z。
代码入下:
ret=0;
for(i=1;i<=N;i++)
{
j=i;
while(j%5==0)
{
ret++;
j/=5;
}
}
公式2的解法:Z=[N/5]+[N/5的平方】+。。。。。
ret=0
while(N)
{
ret+=N/5;
N/=5;
}
问题2:
问题转化:
这个问题实质上等于N!含有质因数2的个数。即答案等于N!含有质因数2的个数加1。
int lowestOne(int N)
{
int Ret=0;
while(N)
{
N>>=1;
Ret+=N;
}
return Ret;
}
N!含有质因数2的个数,还等于N减去N的二进制表示中1的数目。
假设N=1011,那么N!中含有质因数2的个数为[N/2]+[N/4]+[N/8]+[N/16]+....
即1101+110+11+1
=(1000+100+1)+(100+10)+(10+1)+1
=(1000+100+10+1)+(100+10+1)+1
=1111+111+1
=(10000-1)+(1000-1)+(10-1)+(1-1)
=11011-(N二进制表示中1的个数)