思路一:

计算出n!= nValue,然后 nValue % 10 == 0 则nCount自增1,nValue /= 10 直到条件为否,最后nCount就是我们想要的结果,代码如下:

 int CountZero(int n)
{
unsign long long nValue = ;
for (int i = ; i <= n; i ++)
{
nValue *=i;
}
int nCount = ;
while( == nValue % )
{
nCount ++;
nValue /= ;
}
return nCount;
}

代码简洁易懂,看上去还不赖,但是这里要考虑一个问题就是在求n!整数溢出了怎么办?  显然我们使用_int64也同样会有溢出的时候,所以上面的代码实际上是不可行的。

思路二:

不知道怎么办,不妨先举例分析:

! =
! = * =
! = * * =
! = * * * =
! = * * * * =
........
* * * * * * * * * * * *
* * * * * * * * * * * *

我们会发现一个因子2和因子5组合产生一个0,这样我们只需统计1到n有多少个因子对,即n!的尾随零个数,因子2的个数比因子5的个数多,因此我们只需统计出因子5的个数即可,如

,,,,,,.......

需要注意的是,以100!为例:

统计一次5的倍数 (5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100)= 20

统计一次25的倍数(因为25的倍数有两个5的因子,所以再统计一次)(25,50,75,100) = 4

统计一次125的倍数(125的倍数由3个5的因子,所以再统计一次,以此类推)(nil)

所以100!的尾随零个数为24个

实现代码如下:

 int CountZero(int n)
{
int count = ;
if (n < )
return -;
for (int i = ; n / i > ; i *= )
count += n / i;
return count;
}
运行结果:

当n=21时,21!已经溢出。

最新文章

  1. iOS开发CoreGraphics核心图形框架之一——CGPath的应用
  2. 如何将 NavigationBar 的半透明效果关闭?
  3. 线段树 poj 3667
  4. Javascript基础系列之(一)JavaScript语法
  5. 超实用,你get了吗?再也不怕本地文件更新到环境用Linux命令重启服务器了。。。
  6. View的事件分发机制
  7. OpenCV学习 7:图像形态学:腐蚀、膨胀
  8. 如何在VMware虚拟机上安装Linux操作系统(Ubuntu)
  9. 创意HTML5文字特效 类似翻页的效果
  10. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
  11. linux下开启、关闭、重启mysql服务命令
  12. shell编程(七)之字符串处理
  13. corba/ice/web service/com+
  14. log4net写入日志到sqlserver数据库
  15. Java之反射举例
  16. [django]django查询最佳实战
  17. Java -------- 首字母相关排序总结
  18. Java基本语法之动手动脑
  19. Android 性能分析工具 TraceView
  20. HTML后续

热门文章

  1. 突破内网限制上网(ssh+polipo)
  2. shell脚本学习-文件包含
  3. Final——无线网络密码破解——WPA/WPA2
  4. B树/[oracle]connect BY语句
  5. 使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)
  6. TDD:什么是桩(stub)和模拟(mock)?
  7. Ubuntu允许root远程登录配置
  8. Android WebView 加载超长 JS 数据
  9. 对称加密AES
  10. [部署]CentOS安装PHP环境