package com.demo;
/**
* 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3628800,N!的末尾有两个0。
* 此问题不需要计算出N!的值,因为可能溢出。
* 我们可以从哪些数相乘能得到10这个角度来考虑,问题就简单了
* @author ying
*
*/
public class Factorial1 {
/**
* 要计算结果,最简单的方法就是计算i(i=1,2,...,N)的因式分解中5的指数,然后求和
* @param n
* @return返回字符串格式“N!的末尾有ret个0。”
*/
public String method1(int n){
int ret = 0;
int j = 0;
for(int i = 1;i <= n;i++){
j = i;
while(j%5==0){
ret++;
j /= 5;
}
}
return "N!的末尾有"+ret+"个0。";
}
/**
* 公式:Z=[N/5]+[N/(5*5)]+[N/(5*5*5)]+...
* 公式中Z表示结果,[N/5]表示不大于N的数中5的倍数贡献一个5,[N/(5*5)]表示不大于N的数中(5*5)的倍数再贡献一个5......
* @param n
* @return返回字符串格式“N!的末尾有ret个0。”
*/
public String method2(int n){
int ret = 0;
while(n!=0){
ret += n/5;
n/=5;
}
return "N!的末尾有"+ret+"个0。";
}
}
/**
* 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3628800,N!的末尾有两个0。
* 此问题不需要计算出N!的值,因为可能溢出。
* 我们可以从哪些数相乘能得到10这个角度来考虑,问题就简单了
* @author ying
*
*/
public class Factorial1 {
/**
* 要计算结果,最简单的方法就是计算i(i=1,2,...,N)的因式分解中5的指数,然后求和
* @param n
* @return返回字符串格式“N!的末尾有ret个0。”
*/
public String method1(int n){
int ret = 0;
int j = 0;
for(int i = 1;i <= n;i++){
j = i;
while(j%5==0){
ret++;
j /= 5;
}
}
return "N!的末尾有"+ret+"个0。";
}
/**
* 公式:Z=[N/5]+[N/(5*5)]+[N/(5*5*5)]+...
* 公式中Z表示结果,[N/5]表示不大于N的数中5的倍数贡献一个5,[N/(5*5)]表示不大于N的数中(5*5)的倍数再贡献一个5......
* @param n
* @return返回字符串格式“N!的末尾有ret个0。”
*/
public String method2(int n){
int ret = 0;
while(n!=0){
ret += n/5;
n/=5;
}
return "N!的末尾有"+ret+"个0。";
}
}