编程之美2.2学习笔记

来源:互联网 发布:外国留学生来中国数据 编辑:程序博客网 时间:2024/05/13 10:45

阶乘问题:

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的个数)

原创粉丝点击