N!中末尾0的个数
对N!进行质因数分解,N!可以分解成2^x * 3^y * 5^z*,只有2*5才会使N!的末尾产生1个0,
也就是说N!的质因数分解中有多少个2,5对末尾就有多少个0,而N!的质因数中5的个数要少于2的
个数,也就是说2,5对的个数取决于质因中5的个数,所以问题转化为求N!中质因数5的个数
5的个数Z=[N/5] + [N/5^2] + [N/5^3} + ...
[N/5] 表示不大于N的数中5的倍数贡献一个5,[N/5^2]表示不大于N的数中5^2的倍数再贡献一个5
32!= 1 * 2 * 3 * ...*31*32,其中5,10,15,20,30各贡献1个5,25贡献2个5,共7个5
int numOf0(int N)
{
int result = 0;
while(N)
{
N /= 5;
result += N;
}
return result;
}
求N!的二进制表示中最低位的1的位置
从右向左从1 数起
一个数的二进制表示中如果最后是m个0,则这个数有m个质因数2,如36的二进制表示为
100100,它最后有2个0,36=2*2*9,可以看到有2个2,则最低位的1,只比质因数2的个
数多一个,它在第2+1=3位
题目转化为求N!中含有质因数的个数,等于[N/2]+[N/4]+[N/8]+[N/16]+...
[N/2]表示不大于N的数中所有2的倍数贡献一个2*/
int lowestOne(int N)
{
int result = 0;
while(N)
{
N >>= 1; //(N /= 2)
result += N;
}
return result;
}