这其实是一个求N的阶乘末尾有多少个0的问题
分析:
想到这个问题,可能我们第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。但是如果是一个大数,例如100000,肯定会溢出而且效率很低。
于是我们另辟蹊径,把这个问题转换成那些数相乘可以得到10”这个角度,问题就变得比较的简单了。
因为10 = 2 * 5,又因为被2整除的频率比被5整除的频率高的多。所以我们只要求出5的个数就可以了。
/*求100000!末尾有多少个0?*/
public static void main(String[] args) {
int sum=0;
for(int i=1;i<=100000;i++){
int num=i;
while(num%5==0&&num>=5){
num=num/5;
sum++;
}
}
System.out.println(sum);
}
}
方法二:
Z = N/5 + N /(5*5) + N/(5*5*5)…..知道N/(5的K次方)等于0
公式中 N/5表示不大于N的数中能被5整除的数贡献一个5,N/(5*5)表示不大于N的数中能被25整除的数再共享一个5…….
int fun2(int n)
{
int num = 0;
while(n)
{
num += n / 5;
n = n / 5;
}
return num;
}