*分析:
*首先要直接求1000!是不现实的,结果很容易就溢出了。因此,需要换另一种思考方式。
*如果N!=K*(10的M次幂),且K不能被10整除,那么N!的结尾就有M个0。0的产生归根结底就
*是由于2和5的相乘,因此对N!进行质因数分解:N!=(2的X次幂)*(3的Y次幂)*(5的Z次幂)*...,
*由于10=2*5,所以M只与X和Z相关,M=min(X,Z),因为能被2整除的数出现的频率比能被5整除的数多很多,
*所以只要求出Z的值就可以得到0的个数了。Z的值就是1到1000中所包含5的个数。
*/
public class Test {
public static void main(String[] args) {
System.out.println(countZeros(1000));//打印1000!末尾0的个数
}
/**
* 求一个数的阶乘末尾0的个数
* @param N 正整数
* @return 0的个数
*/
public static int countZeros(int N){
int count = 0;//记录5的个数
//遍历1到N,求解5的个数
for(int i = 1;i <= N;i++){
int j = i;//临时变量,保存i的值
while(j % 5 == 0){//如果能被5整除,5的个数加1
count++;
j = j / 5;//得到j除以5以后的数,作为下一回循环的开始值
}
}
return count;//返回5的个数,也就是末尾0的个数
}
}
|