题目:
1.给定一个整数N,那么N的阶乘N!末尾有多少个0?如N=10,N!=3628800,N!的末尾有两个0;
2.求N!的二进制表示中最低位1的位置。
问题1解法一:
基本思想:
N!=K*10^M,那么N!末尾有M个0.
N!=2^X*3^Y*5^Z,M=min(X,Z)。因为X>=Z,所以M=Z。
计算i(i=1,2,---,N)的因为分解中5的指数,求和。
ret=0;
for(i=1;i<=N;i++)
{
j=i;
while(j%5==0)
{
ret++;
j/=5;
}
}
问题1解法二:
基本思想:
Z=[N/5]+[N/5^2]+[N/5^3]+......
ret=0;
while(N)
{
ret+=N/5;
N/=5;
}
问题2的解法:
N!中含有质因数2的个数,=[N/2]+[N/4]+[N/8]+.....
int lowestOne(int n)
{
int ret=0;
whiel(N)
{
N>>=1;
ret+=N;
}
return ret;
}