末尾0的个数
链接:https://www.nowcoder.com/questionTerminal/6ffdd7e4197c403e88c6a8aa3e7a332a
来源:牛客网
时间限制:1秒 空间限制:32768K
输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
输入描述:
输入为一行,n(1 ≤ n ≤ 1000)
输出描述:
输出一个整数,即题目所求
示例1
输入
10
输出
2
解题思路,暴力解决的话很容易出现最大值溢出,但是java考虑到有BigInteger类可以尝试
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int len = input.nextInt();
BigInteger num = BigInteger.ONE;
for(int i=1;i<=len;i++){
num =num.multiply(BigInteger.valueOf(i));
}
String num1 = num.toString();
int count=0;
for(int i=num1.length()-1;i>=1;i--){
if(num1.charAt(i)=='0'){
count ++;
}else{
break;
}
}
System.out.println(count);
}
结果出来了但是运算量巨大
这个时候可以考虑(等价转化复杂问题)
首先考虑末尾0的位数:
1. 首先只有当 2*5或者 4*5或者 8*5 会出现0得出结论 :偶数乘以5时会产生0
2. 阶乘 1*2*3*4*5=120 有一个0
1*2*3*4*5*6*7*8*9*10=3628800有2个0、
1*2*3*4*5*6*7*8*9*10*11*12*13*14*15=1307674368000有3个零
1*2*3*4*5*6*7*8*9*10 可以看成 1*2*3*4*5*6*7*8*9*2*5
1*2*3*4*5*6*7*8*9*10*11*12*13*14*15 可以看成 1*2*3*4*5*6*7*8*9*2*5*11*12*13*14*3*5
.......
3. 一个数一旦变成偶数无论怎么相乘都不可能变成奇数,阶乘在遇见第一个5的时候就已经变成偶数了
4.一个偶数每乘一个5,尾数的零就会多一,求尾数零的个数就变成了求阶乘中 5 出现的次数。
5. 25=5*5、75=5*5*3、125=5*5*5 注意这些数可以拆分成多个5
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int len = input.nextInt();
int count=0;
int num;
for(int i=1;i<=len;i++){
num = i;
while(num%5==0){//如果是5的倍数那么 尝试拆分
count++;
num=num/5;
}
}
System.out.println(count);
}