n的阶乘末尾有多少个0?

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

static int SumOfFive(int num){

 int count = 0;
while(num!=0){
 num /= 5;
 count += num;
}
return count;
}

猜你喜欢

转载自blog.csdn.net/weixin_39296576/article/details/90400373
今日推荐