n!末尾0的个数

Description

对于数学阶乘N!当N得数很大时我们会发现N!是个很大的数,我们很难去计算,但是我们很容易计算出N!的末尾的0的个数,所以现在设函数Z(N)为N!的末尾的0的个数。

Input

输入第一行包括一个整数T,表示接下来的测试实例的个数,接下来的T行,每行包括一个 整数N,1< = N <= 1000000000.

Output

对于每一个数N,输出一个对应的Z(N);

Sample Input

3
3
60
8735373

Sample Output

0
14
2183837

 
 

对于数学阶乘N! 当N得数很大时我们会发现N!是个很大的数,我们很难去计算,但是我们很容易计算出N!的末尾的0的个数,所以现在设函数Z(N)为N!的末尾的0的个数。


#include<stdio.h>
int main()
{
 int t,s,n,m;
 scanf("%d",&t);
 while(t--)
 {
  scanf("%d",&n);
  s=0;
  m=n;
  while(m>4)
  {
   m=m/5;
   s=s+m;
  }
  printf("%d\n",s);
 }
 return 0;
} 

我曾经研究过世界奥林匹克的题,最终发现一个无与伦比的简单解法:

用原数除以5,如100/5=20;

如果得数大于5则将得数再除以5,即20/5=4;

依次类推,直到得数小于4时停止,将以上得数相加

得(20+4)=24,即为解
再举一个例子:

1000/5=200;

200/5=40;

40/5=8;

8/5=1...3;
则1000!末尾有(200+40+8+1)=249.
注意:如果除的过程中发现有余数,则去掉余数,用得数接着算即可,就如8/5=1...3,这里3是没有任何作用的
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值