c语言N的阶乘质因子分解,n阶乘质因子2的个数

本文介绍了如何使用c语言计算一个整数N的阶乘末尾0的个数,通过分析质因数分解,得出求解公式。同时探讨了求阶乘二进制表示中最低位1的位置,转换问题并提供两种解法。
摘要由CSDN通过智能技术生成

阶乘(Factorial)是个很有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题:

1、

给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628

800,N!的末尾有两个0。

2、求N!的二进制表示中最低位1的位置。

有些人碰到这样的题目会想:是不是要完整计算出N!的值?如果溢出怎么办?事实上,如果我们从"哪些数相乘能得到10"这个角度来考虑,问题就变得简单了。

首先考虑,如果N!=

K×10^M,且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^x)×(3^y)×(5^z)…,由于10

= 2×5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M = min(X,

Z)。不难看出X大于等于Z,因为能被2整除的数出现的频率比能被5整除的数高得多,所以把公式简化为M = Z。

根据上面的分析,只要计算出Z的值,就可以得到N!末尾0的个数。

【问题1的解法一】

要计算Z,最直接的方法,就是计算i(i

=1, 2, …, N)的因式分解中5的指数,然后求和:

ret = 0;

for(i = 1; i &l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值