1.先求res = n!,然后 tmp = res %10, if(tmp ==0)count++,造成问题,n!的增长很夸张,一不小心就溢出了
2.追究到底,这种题目还是找规律的题
会发现2*5=10,这样子就多出来一个0了,所以问题可以转化成求有多少对2和5,但2的个数明显比5还要多,所以只关心5的个数就好了。当然了,有时候一个数里可不止一个5,比如25=5*5,125=5*5*5。
那么问题来啦,怎么求有多少个5呀?
5! :1*2*3*4*5 有一个5 ,
10!: 1*2*3*4*5*6*7*8*9*10 有2个5(10=2*5)
15!:1*...*5*...*10*...*15有3个5(15=3*5)
20!: 1*...*5*...*10*...*15*...*20有4个5
25! : 1*2*3*4*5*6*7*8*9*10 ..15 ..20 ..24*25 有6个5(因为25=5*5)
50!: 5,10,15,20,25,30,35,40,45,50有12个5,因为有2个25,多了两个5
那60的话, 单独的5有12个,多出来2个25(25有一个25,50有一个25),多了两个5,所以是14个5
会发现,
25里面,5的个数:25/5=5(5的个数), 5/5=1(25的个数),所以是5+1=6
50里面,5的个数:50/5=10, 10/5 = 2, 所以是10+2 = 12
100里面,5的个数:100/5=20,20/5=4,所以是24
125里面,5的个数:125/5=25(5的个数),25/5=5(25的个数),5/5=1(125的个数),所以是31
假如n = 2019好了
2019!里面5的个数:2019/5=403个
2019!里面25的个数:403/5=80个(多出来的5)
2019!里面125的个数:80/5=16个(多出来的5)
2019!里面625的个数:16/5=3个(多出来的5)
所以一共有5的个数:403+80+16+3=502
public static int sumOfFive(int n){
if(n<5) return 0;
n/=5;
return n+sumOfFive(n);
}