这是滴滴打车的一道面试题,看似简单,其实不然,有点小技巧。
我刚看到这道题的时候,感觉很简单,于是三下五除二的写好了代码。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
/*输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
输入描述:*/
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long n=sc.nextLong();
long sum=1;
int l=0;
for (long i = 1; i <=n; i++) {
sum*=i;
}
System.out.println(sum);
String ssum=String.valueOf(sum);
char[] csum=ssum.toCharArray();
for (int i = csum.length-1; i >=0 ; i--) {
if('0'!=(csum[i])){
break;
}
l++;
}
System.out.println(l);
}
}
逻辑简单明了,完全的线性逻辑。但是不巧的是即使我用Long类型,还是有溢出的现象,用比较小的数测试的时候,答案正确,但是。。。
真正的诀窍在这里:
先分析一下:
我们在计算n的阶乘时,实际上就是把所有小于等于n的正整数分解成质因数,然后再将其乘到一起,那么末尾0的个数实际上就是2*5的个数,而2的个数明显是很多很多的,所以问题就转化成了5的个数。即就每个数可以由几个5相乘,再把全部的5加到一起就是了。
原来是这样:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int res = 0;
//计算出每个数里面有几个5。
for(int i = n; i >= 5; i--) {
int tmp = i;
while(tmp % 5 == 0) {
res++;
tmp /= 5;
}
}
System.out.println(res);
}
}