计算N的阶乘末尾0的个数
1.常规思路
求阶乘再统计0的个数
import java.util.Scanner;
//输入一个n,求n!末尾有几个0
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
long sum = 1;
while (num > 1){
sum *= num;
num--;
}
int count = 0;
while (sum % 10 == 0){
count++;
sum = sum / 10;
}
System.out.println(count);
}
}
这个思路时一个正常思路,很朴素,但是有很多问题:
1、计算阶乘的开销大
2、会溢出long类型数据的最大值
3、效率底
2.科学思路
我们以125为例子来分析;125的阶乘为
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15…125
当1乘到5会产生一个0;
当1乘到10会产生两个0;
当1乘到15会产生三个0…
我们不难看出每间隔5个数会产生一个0把这些数字抽取出来是:
...、5、...、10、...、15、...、20、...、25、...
这些数字其实是都能满足5*k
的数字,是5的倍数。统计一下他们的数量:n1=N/5
。
2、将1
中的这些数字化成5*(1、2、3、4、5、...)
的形式,内部的1、2、3、4、5、...
又满足上面的分析:每5个数字有一个是5的倍数。抽取为:
...、25、...、50、...、75、...、100、...、125、...
import java.util.Scanner;
//输入一个n,求n!末尾有几个0
//n能被5(5^1)整除的提供1个0
//n能被25(5^2)整除的提供2个0
//n能被125(5^3)整除的提供3个0
//n能被625(5^4)整除的提供4个0
//所以 结果= n/5 + n/25 + n/125 + n/625
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int count = 0;
while (num > 0){
count += num / 5;
num = num / 5;
}
System.out.println(count);
}
}