题目:
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; }
原文地址:http://blog.csdn.net/wtyvhreal/article/details/45246639