在编程之美上看到这个题,并没有直接用阶乘计算,这可能会有溢出,而且效率不高,以下采用数学方法解答
问题一:求阶乘数结尾0的个数
思路:结尾出现0,只有2*5才能出现0,所以,要求2和5的个数,显然2的个数肯定大于5的个数,该题变成了求5的个数,对N!进行质因数分解: N!=2X*3Y*5Z
所以有如下代码
public static int find_zero_back(int num){
int n=0;
while(num!=0){
n+=num/5;
num=num/5;
}
return n;
}
问题二:求阶乘数二进制最后一个1的位置
思路同方法一,
代码如下:
public static int find_last_one(int num){
int n=0;
while(num!=0){
n+=num>>1;
}
return n;
}