现在的位置: 首页 > 综合 > 正文

编程之美2.2学习笔记

2018年05月13日 ⁄ 综合 ⁄ 共 635字 ⁄ 字号 评论关闭

阶乘问题:

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

抱歉!评论已关闭.