阶乘后的零(C语言)

您所在的位置:网站首页 零的阶乘等于什么 阶乘后的零(C语言)

阶乘后的零(C语言)

2024-07-09 18:36| 来源: 网络整理| 查看: 265

文章目录 题目分析代码实现 让我们来看看这道题的描述。

题目:给定一个整数 n ,返回 n! 结果中尾随零的数量。

输入:n = 3 输出:0 解释:3! = 6 ,不含尾随 0

输入:n = 5 输出:1 解释:5! = 120 ,有一个尾随 0

题目来源(力扣):阶乘后的零

题目分析

很显然,直接去计算某个整数的阶乘再判断尾随零,肯定不行的。因为如果是算一个比较大的整数的阶乘时,其结果是非常大的,以致于用什么类型的变量去存储都会产生溢出。

所以,我们必须换个角度去思考这个问题。不难发现,当一个正整数乘以10时,它会扩大为原来的10倍,从而结果多了一个尾随零。但当计算 5! 时,它的结果也有尾随零。那么是什么导致了 5! 结果中的尾随零呢? 让我们把 5! 的原式展开看一下,5! = 5 * 4 * 3 * 2 * 1 . 可以发现 5! 中含有2 * 5,也就是相当于是10。 既然如此,那么我们可以把10给拆解成2 * 5,从更细小的角度去分析问题。

再列举一个整数的阶乘,比如: 15! = 15 * 14 * 13 * 12 * 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 15! = (3 * 5)*(2 * 7) * 13 *(2 * 6) * 11 *(2 * 5) * (3 * 3) * (2 * 4) * 7 *(2 * 3) * 5 *(2 * 2) * 3 * 2 * 1

(事先计算得知,15! 的结果的尾随零个数是3) 进一步发现,每5个数出现一次因子5,每2个数出现一次因子2,也就是说,因子2的个数一定是不少于因子5的个数的。换言之,找到一个因子5,同时一定有一个因子2与其配对。既然如此,我们可以把问题(求n! 的结果中尾随零的个数)转换为求 n! 中含有因子5的个数是多少。

可是,且慢!再仔细想想,n! 中含有因子5的个数仅仅来源于那每5个数出现的1次因子5吗? 如果是求 25! 结果中的尾随零个数呢?把它展开,25! = 25 * 24 * 23 * … * 2 * 1. 其中25 = 5 * 5,也就是说一个数的因子中有可能含有多于一个的5 ,比如 125! 中125 = 5 * 5 * 5 等。

当中有规律: 每 5 个数出现1次因子5, 每25个数出现2次因子5, 每125个数出现3次因子5, …, 以此类推。

画一个图直观地感受一下:

每25个数出现2次5,也就是说,每5个数加一次5,每25个数还要多加一次5。 以此类推。

也就是说 因子5的个数 等于 n/5 + n/25 + n/125 …

但还是老问题,分母很大的时候也不行,会造成溢出问题。所以就写成 每当 n/5 后,把 n 更新一次。

可以理解为:

代码实现

再转换成代码如下:

int trailingZeroes(int n){ int cnt=0; //记录因子5的个数 while(n>0) { cnt+=n/5; n/=5; //更新n } return cnt; }

测试一般例子,结果是对的。 再考虑特殊例子:0! = 1 , 尾随零的个数为0。 显然程序运行的结果 cnt = 0,满足条件。

更多文章 调整数组顺序使奇数位于偶数前面(C语言)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3