博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阶乘后的零
阅读量:3926 次
发布时间:2019-05-23

本文共 1502 字,大约阅读时间需要 5 分钟。

点击上方蓝字关注我,我们一起学编程

欢迎小伙伴们分享、转载、私信、赞赏

微信搜索:编程笔记本

微信搜索:编程笔记本
微信搜索:编程笔记本

进提案分享一道兆芯科技的笔试编程题:阶乘后的零

题目描述:

给定一个整数 n,返回 n! 末尾零的数量。

微信搜索:编程笔记本
微信搜索:编程笔记本
微信搜索:编程笔记本

1. 计算阶乘

int trailingZeroes(int n){
int count = 0; int factorial = 1; // 存储阶乘结果 // 计算阶乘 while (n > 0) {
factorial *= n--; } // 计算尾部的零数 while (factorial % 10 == 0) {
++count; factorial /= 10; } return count;}

这种方法有两个问题:

  • 第一个问题是计算阶乘十分耗时
  • 第二个问题是保存阶乘结果的变量很容易溢出

微信搜索:编程笔记本

微信搜索:编程笔记本
微信搜索:编程笔记本

2. 计算因子5

我们发现,在 0~9 中,能够产生 0 的只有整十数以及 2*5。其中,“整十数”也可以分解成 “5” 与其他整数的乘积。

一个自然的想法时:**计算包含的因子 5 的数量。凑成2*5的数对,2 的数量比 5 的数量要多出很多,因此 5 的数量就是2*5**数对的数量。

int trailingZeroes(int n){
int five = 0; for (int i = 1; i <= n; ++i) {
if (i % 5 == 0) {
++five; } } return five;}

上面的代码段有一些问题:比方说,在数字 25 中,它可以分解成 5*5 ,相当于一个数贡献了两个 5 。所以我们需要对这种情况进行处理。

int trailingZeroes(int n){
int five = 0; for (int i = 1; i <= n; ++i) {
int tmp = i; while (tmp % 5 == 0) {
++five; tmp /= 5; } } return five;}

微信搜索:编程笔记本

微信搜索:编程笔记本
微信搜索:编程笔记本

一个小小的优化:

我们不需要从 1 开始,也不需要每次递增 1 ,因为非 5 的整倍数对数对的贡献为 0 。

int trailingZeroes(int n){
int five = 0; for (int i = 5; i <= n; i += 5) {
int tmp = i; while (tmp % 5 == 0) {
++five; tmp /= 5; } } return five;}

上面的程序段抽象成数学式子就是:

所以,一种更加高效的求解方法是:

int trailingZeroes(int n) {
int count = 0; while (n > 0) {
count += n / 5; n = n / 5; } return count;}

至此,这个问题就解决啦~

微信搜索:编程笔记本

微信搜索:编程笔记本
微信搜索:编程笔记本

你可能感兴趣的文章
WPF实现环(圆)形菜单
查看>>
WPF 写一个提醒工具软件(完整项目)
查看>>
Windows 11 快速体验:开始菜单居中,全系圆角设计!
查看>>
异步流使用注意事项
查看>>
NET问答: 为什么仅有 getter 的属性,还可以在构造函数中赋值 ?
查看>>
WPF TextBox限制只能输入数字的两种方法
查看>>
【荐】牛逼的WPF动画库:XamlFlair
查看>>
如何绕过 TPM 2.0 安装 Windows 11 操作系统?
查看>>
为WPF播放GIF伤神不?
查看>>
.NET Core with 微服务 - Elastic APM
查看>>
生产力提升! 自己动手自定义Visual Studio 2019的 类创建模板,制作简易版Vsix安装包...
查看>>
考虑用Task.WhenAll
查看>>
关于面试,避开这几点,成功几率更大~~~
查看>>
堵俊平:开放治理是开源社区的终极之路 | DEV. Together 2021 中国开发者生态峰会...
查看>>
Linux实操--实用指令Day3
查看>>
Linux实操--实用指令Day4
查看>>
Linux实操--实用指令Day3
查看>>
spring+springboot认识
查看>>
Leetcode 136. 只出现一次的数字
查看>>
Leetcode 11. 盛最多水的容器
查看>>