大数阶乘问题,是很常见的,来看一下T公司的面试题目:

问题一:

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

问题二:

1000的阶乘有多少位数?

问题三:

1000的阶乘的值是多少?

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

直接递归计算吗?有点天真了。1000的阶乘,是一个非常大的数字,得想其它办法了。注意:要求的是1000的阶乘末尾的0的个数,而不是求1000的阶乘。

很显然,从分解质因数的过程来看,结尾的0必然是2和5的乘积,而且在阶乘中,5是稀缺值,而2是富余值,所以,只需要知道质因数中5的个数就行了。我们以26的阶乘为例:

26!
= 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * ... * 25 * 26
= 1 * 2 * 3 * 2*2 * 5 * 2*3 * 7 * 2*2*2 * 9 * 2*5 * 11 * ...3*5 * ... * 4*5 * ... * 5*5 * 2*13

可见:其中有6个5,有充足的2,所以只需要看5的个数。易知,26的阶乘的末尾有6个0. 用阶乘计算器来看下,果然如此:

我们来讨论更一般的情况:

设f(x)是x中因数5的个数, [x]为x向下取整的值,则有:

f(n!)
= f(1 * 2 * 3 * 4 * 5 * 6 * ... * n)
= f(1 * 2 * 3 * 4 * 5 * 6 * ... * ([n/5]*5))
= f(5 * 10 * ... * ([n/5]*5))
= f(5*1 * 5*2 * ... * ([n/5]*5))
= f(5^[n/5] * 1 * 2 * ... * [n/5])
= [n/5] + f(1 * 2 * ... * [n/5])
= [n/5] + [n/25] + f(1 * 2 * ... * [n/25])
= [n/5] + [n/25] + [n/125] + f(1 * 2 * ... * [n/125])
= [n/5] + [n/25] + [n/125] + [n/625] + ... + 0

所以:

f(1000!)
= [1000/5] + [1000/25] + [1000/125] + [1000/625] + [1000/3125]
= 200 + 40 + 8 + 1 + 0
= 249

至于程序,给个递归版本吧:

package mainimport ("fmt"
)func getNum(i int) int {if i < 5 {return 0}return i/5 + getNum(i/5)
}func main() {fmt.Println(getNum(1000))
}

结果:249.  可见,1000的阶乘末尾有249个0.

1000的阶乘有多少位数?

直接递归计算吗?有点天真了。我们来看下如下规律:

lg99 = 1.a
lg100 = 2
lg101 = 2.blg999 = 2.c
lg1000 = 3
lg1001 = 3.d

设f(x)为x的数位个数,[x]为x向下取整的值,则有:

f(x)
= [lg(x)] + 1f(n!)
= f(1 * 2 * 3 * ... * n)
= [lg(1 * 2 * 3 * ... * n)] + 1
= [lg1 + lg2 + lg3 + ... + lg(n)] + 1

至于程序,那就很简单了:

package mainimport ("fmt""math"
)func main() {f := float64(0)for i := 1; i <= 1000; i++ {f = f + math.Log10(float64(i))}n := int(f) + 1fmt.Println(n)
}

结果:2568.  可见,1000的阶乘有2568位。

1000的阶乘的值是多少?

直接递归计算吗?有点天真了。 还是用字符串来做吧:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;int multi(char a, char b)
{return (a - '0') * (b - '0');
}void strMulti(char *a, char *b, char *c)
{int lenA = strlen(a);int lenB = strlen(b);int maxLen = lenA + lenB;int *p = new int[maxLen];memset(p, 0, maxLen * sizeof(int)); int i = 0;int j = 0;for(j = lenB - 1; j >= 0; j--){for(i = lenA - 1; i >= 0; i--){p[j + i + 1] += multi(b[j], a[i]);}}// 处理进位操作for(i = maxLen - 1; i >= 1; i--){p[i - 1] += p[i] / 10;p[i] = p[i] % 10;}int *s = p;// m位正整数和n位正整数相乘,结果的位数必然是(m+n-1)位或者(m+n)位if(0 == p[0]){p++;}int *pTmp = NULL;for(pTmp = p; pTmp < s + maxLen; pTmp++){*c++ = *pTmp + '0';}*c = '\0';delete s;
}void factorial(int n, char *str)
{int i = 0;*str = '1';*(str + 1) = '\0';char b[5000] = {0};for(i = 1; i <= n; i++){snprintf(b, sizeof(b), "%d", i);strMulti(str, b, str);}
}int main()
{char str[5000] = {0};factorial(1000, str); cout << str << endl << endl;return 0;
}

结果是:

可以看到,1000的阶乘有2568位,且最后有249个0.

关于1000的阶乘,就说到这里了。遇到问题,要灵活应变,从具体到抽象,抓住本质。

笔试面试题目:1000的阶乘问题相关推荐

  1. 46家中外知名企业笔试面试题目

    http://blog.sina.com.cn/s/blog_4897add3010009wj.html 微软 智力题 1.烧一根不均匀的绳子,从头烧到尾总共需要1个小时,问如何用烧绳子的方法来确 定 ...

  2. 面试官吐槽:“软件测试员就是不行!”网友:我能把你面哭了!——软件测试笔试面试题目完全汇总

    软件测试笔试面试题目完全汇总 软件缺陷: 1)软件未实现产品说明书要求的功能 2)软件出现了产品说明书指明不应该出现的错误 3)软件实现了产品说明书未提到的功能 4)软件未实现产品说明书虽未明确提及但 ...

  3. 12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

    0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比 ...

  4. 2021秋招嵌入式笔试面试题目汇总

    ​本系列按类别对题目进行分类整理,这样有利于大家对嵌入式的笔试面试考察框架有一个完整的理解. 欢迎关注公众号<嵌入式Linux系统开发>,定期分享硬件.单片机.嵌入式Linux技术文章,支 ...

  5. 【数字设计】芯动科技|芯原科技_2023届_笔试面试题目分享

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  6. 嵌入式笔试面试题目系列(汇总)

    嵌入式笔试 一.进程与线程 1.什么是进程.线程,有什么区别? 2.多进程.多线程的优缺点 3.什么时候用进程,什么时候用线程 4.多进程.多线程同步(通讯)的方法 5.进程线程的状态转换图 6.父进 ...

  7. 【数字设计】经纬恒润_2023届_笔试面试题目分享

    芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球 四社区联合力荐!近500篇数字IC精品文章收录! [数字IC精品文章收录]学习路线·基础知识·总线·脚本语言·芯片求职· ...

  8. 数字IC笔试面试题目总结1_同步异步、竞争冒险

    数字IC笔试面试题目总结1 同步和异步 竞争.冒险与亚稳态 格雷码与Latch 大部分内容均来自网络公开资料,如有侵权,请联系删除! 同步和异步 同步电路和异步电路最主要的区别是什么 异步电路主要是组 ...

  9. 淘宝,微软,IBM等公司笔试,面试题目

    ①淘宝笔试题目 题目大意如下:请使用C语言完成strnicmp的编码实现,要求不能调用任何其他函数.strcicmp完成两个ascii字符串的比较,忽略大小写(两个英文字母比时,认为大小写无差别),最 ...

最新文章

  1. Python对文件的三种打开方式以及with管理上下文
  2. node 版本升级_Node-RED: 自动化事件触发工具的安装与介绍
  3. cstring 不明确_股价不可预测明确时间点的涨跌
  4. python日志输入 print 常用格式化符号 logging 日志输出
  5. python通过代理自动发邮件脚本_python自动发送邮件脚本
  6. 敏捷开发免费管理工具——火星人预览之四:故事板,燃尽图,我的工作项
  7. Matlab2016a如何关联M文件
  8. 尚硅谷谷粒商城项目介绍
  9. 编程英语单词1.编程常用英语词汇大全
  10. [USACO 2009 Dec G]Video Game Troubles-----分组背包的改良版
  11. 计算机硬盘170gb,假的:《最终幻想15》PC推荐配置GTX1080Ti+170GB硬盘为误传
  12. VTK 学习----3D基础知识-着色器和图形管道
  13. TRACERT-NBTSTAT-AT-NETSH 命令及用法
  14. 华为南研所校招软件技术岗几点建议
  15. 《公共管理学》考试重点及答案
  16. PIN, PIN2, PUK, PUK2
  17. 记录我删库没跑路的处理方式
  18. WIN7下硬盘安装linux双系统教程(EasyBCD法)
  19. 大牛的《深度学习》笔记,Deep Learning速成教程
  20. 透过近期CAFC判例看功能性限定对专利的重大影响

热门文章

  1. 【Pandas超实用经验汇总-数据建模分析】
  2. 【GT-安卓应用开发之点赞列表实现】
  3. 小动物搬家划分无冲突子集Python
  4. K站 动漫头像 爬虫 python
  5. 设计师的最爱:免费素材网站
  6. 菲戈挑战足球守门员机器人原理
  7. 计算机excel计算If怎么算,Excel函数公式:关于SUMIF函数的那些事儿,全在此篇
  8. Python采集周边烤肉店数据,康康哪一家最好吃?
  9. termux 安装centos
  10. 【构造函数】解析构造函数的作用