一、问题描述:在lintcode上有这么一个问题,如下图所示。设计一个算法,计算出n阶乘中尾部零的个数。

二、尝试

(1)相信很多人看到这个问题的第一个想法就是,先计算n阶乘的结果,然后对10进行求余判断,而被10整除的次数就是尾部零的个数。代码如下:

long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.//计算n阶乘int s=1;for(int i=1;i<=n;i++){s=s*i;}//对结果进行判断int num = 0;//对10进行求余while(s%10==0){num++;s = s/10;}return num;}

看结果,说容易陷入死循环。为什么会陷入死循环呢?n才是105哎,105!等于多少?用了一个在线阶乘计算器计算发现结果很大1.0813967582402912e+168。而int是32位,数据早已溢出,所以,用于存放阶乘结果的s要改成长整型long long int。

(2)再次尝试,发现依然运行超时。看来计算n阶乘占用的空间和时间都比较长。

(3)当我们尝试从1到n逐次计算n阶乘时,会发现一个规律,遇见能被5整除的数时,尾部0就可+1;而尾部的0一共有多少个,就要看这个数包含多少个5的因子。比如1到4的阶乘结果分别为1、2、6、24,5到9的阶乘结果是120、720、5040、40320、362880,10到14的结果分别是3628800、39916800、479001600、6227020800、87178291200,然后15!=1307674368000。也就是5有一个0,10有2个0,15有3个0,20有4个0,25有6个0,30有7个0等等,代码如下

long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.//计算n阶乘long long num = 0;long long temp=n;while(temp){temp /= 5;num += temp;}return num;}

结果

值得注意的一件事就是,其中数据类型的定义,要是long long类型的,这一点题目在定义的时候函数结果上也有提示。

在线计算阶乘的地址http://www.99cankao.com/statistics/factorial-calculator.php

计算n阶乘的末尾有几个0相关推荐

  1. C语言给定数字n阶乘的末尾计算零个数(附完整源码)

    给定数字n阶乘的末尾计算零个数 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) #include <math.h> ...

  2. 面试题:计算 n!阶乘的结果的末尾有几个0

    前言 首先基于一个事实:我们不可能真的把 n! 的结果计算出来,再去数结果的末尾有几个0:n 很小还好,如果n很大,甚至趋近于无穷大,我们是不可能这样做的.原因主要有二: 一般计算机的计算能力和存储能 ...

  3. C++版本计算n阶乘末尾0的个数原理讲解及代码实现

    C++版本计算n阶乘末尾0的个数原理讲解及代码实现 /*! * Copyright (c) 2020,ZYF. * All Rights Reserved. * * \file Factorial.c ...

  4. android 计算器显示不全,Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略的解决方法...

    Android5.0 计算器计算结果不准确和结果末尾的多余的'0'没有省略 一.问题的描述: [测试步骤] 1.进入计算器 2.输入 100-99.9 3.查看计算结果 [测试结果] 1.结果为: 0 ...

  5. pku1401 Factorial 计算n!末尾有几个0?

    /*Author:yzm求阶乘末尾0的个数因式分解,有多少对2和5,末尾就有多少个0而总是2多5少,所以5的个数决定了0的个数进位思想:先看有多少个5 (v除以5)再看有多少个25 (v再除以5)再看 ...

  6. 精度计算——大数阶乘

    精度计算--大数阶乘 摘自一个 ACM函数模板 ,学习记录自己的理解(^U^)ノ~YO 语法:int result=factorial(int n) 参数:n: n的阶乘 返回值:阶乘的结果 注意: ...

  7. NUC1013 阶乘结果末尾有多少零【分析思维】

    阶乘结果末尾有多少零 时间限制: 1000ms 内存限制: 65536KB 通过次数: 4总提交次数: 14 问题描述 1000的阶乘1*2*3*...*1000结果是一个超过2500位的数,求这么大 ...

  8. 本题要求实现一个计算非负整数阶乘的简单函数

    本题要求实现一个计算非负整数阶乘的简单函数. 函数接口定义: int Factorial( const int N ); 其中N是用户传入的参数,其值不超过12.如果N是非负整数,则该函数必须返回N的 ...

  9. 简单阶乘计算 (本题要求实现一个计算非负整数阶乘的简单函数)

    6.简单阶乘计算 本题要求实现一个计算非负整数阶乘的简单函数. 实现代码: int Factorial(const int N ) {int i,n=1;if(N>=0){for(i=0;i&l ...

最新文章

  1. Java中创建String的两种方式差异
  2. LeetCode 289. Game of Life--Java,Python解法
  3. linux RTX2080显卡驱动
  4. asp.net C# 将数据导出到Execl汇总
  5. [半翻] 设计面向DDD的微服务
  6. Extjs 数据代理
  7. 统计数据:Google排名高的是什么样的页面?
  8. RTT内核对象——内核对象的派生
  9. 2019年12月中国编程语言排行和薪资分析
  10. 德鲁伊 oltp oltp_内存中OLTP –娱乐看门狗的三个关键点
  11. Springboot 应用部署建议
  12. 怎么在InfoPath Web浏览器表单中弹出对话框?
  13. 第13周 本周个人总结
  14. 无锁队列详细分解 — 顶层设计
  15. Android Studio 中 gradle 下载失败的解决办法
  16. 良品铺子的2021:营收创新高后的“战术调整”
  17. 一杯茶的时间,上手 Django 框架开发
  18. 2019腾讯广告算法大赛
  19. 结构光3D成像原理及应用
  20. Dell EMC PowerEdge R740 服务器的驱动程序和固件更新

热门文章

  1. 罗马利亚夫妻网恋结婚 给儿子取名“雅虎”
  2. C.Emergency Evacuation(贪心)
  3. MarkDown使用总结
  4. 【FPGA教程案例6】基于vivado核的双口RAM设计与实现
  5. 热传递 matlab,一维热传导MATLAB模拟.pdf
  6. EDA(Quartus II)——正弦信号发生器的设计
  7. App适配iOS 11
  8. TTL电平、CMOS电平、RS232电平的介绍
  9. zigbee智能家居
  10. 用“串口分身”完成多个应用访问同一台串口设备