阶乘(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 <= N; i++)
{
j = i;
while(j % 5 ==0)
{
ret++; //统计N的阶乘中那些能够被5整除的因子的个数
j /= 5;
}
}
【问题1的解法二】
公式:Z = [N/5] +[N/5^2] +[N/5^3] + …(不用担心这会是一个无穷的运算,因为总存在一个K,使得5^K > N,[N/5^K]=0。)
公式中,[N/5]表示不大于N的数中5的倍数贡献一个5,[N/5^2]表示不大于N的数中5^2的倍数再贡献一个5,……代码如下:
复制代码 代码如下:
ret = 0;
while(N)
{
ret += N / 5;
N /= 5;
}
问题2要求的是N!的二进制表示中最低位1的位置。给定一个整数N,求N!二进制表示的最低位1在第几位?例如:给定N = 3,N!= 6,那么N!的二进制表示(1 010)的最低位1在第二位。
为了得到更好的解法,首先要对题目进行一下转化。
首先来看一下一个二进制数除以2的计算过程和结果是怎样的。
把一个二进制数除以2,实际过程如下:
判断最后一个二进制位是否为0,若为0,则将此二进制数右移一位,即为商值(为什么);反之,若为1,则说明这个二进制数是奇数,无法被2整除(这又是为什么)。
所以,这个问题实际上等同于求N!含有质因数2的个数+1。即答案等于N!含有质因数2的个数加1。 实际上N!都为偶数,因为质因数里面都有一个2,除了1以外,因为1的阶乘是1,是个奇数,其他数的阶乘都是偶数。。
【问题2的解法一】
由于N! 中含有质因数2的个数,等于 N/2 + N/4 + N/8 + N/16 + …[1],
根据上述分析,得到具体算法,如下所示:
复制代码 代码如下:
/*
可以先求出N!中2的个数(因为每存在一个2,则在数的
最低位多1个0)。因此求1的最低位的位置即为N!中2的个数+1;
*/
int lowestOnePos(int n)
{
int ret = 0; //统计n!中含有质因数2的个数
while(n)
{
n >>= 1;
ret += n;
}
return ret+1;
}
【问题2的解法二】
N!含有质因数2的个数,还等于N减去N的二进制表示中1的数目。我们还可以通过这个规律来求解。
下面对这个规律进行举例说明,假设 N = 11011,那么N!中含有质因数2的个数为 N/2 + N/4 + N/8 + N/16 + …
复制代码 代码如下:
即: 1101 + 110 + 11 + 1
=(1000 + 100 + 1)
+(100 + 10)
+(10 + 1)
+ 1
=(1000 + 100+ 10 + 1)+(100 + 10 + 1)+ 1
= 1111 + 111 + 1
=(10000 -1)+(1000 - 1)+(10-1)+(1-1)
= 11011-N二进制表示中1的个数
小结
任意一个长度为m的二进制数N可以表示为N = b[1] + b[2] * 2 + b[3] * 22 + … + b[m] * 2(m-1),其中b [ i ]表示此二进制数第i位上的数字(1或0)。所以,若最低位b[1]为1,则说明N为奇数;反之为偶数,将其除以2,即等于将整个二进制数向低位移一位。
相关题目
给定整数n,判断它是否为2的方幂(解答提示:n>0&&((n&(n-1))==0))。
--------------------------------------------------------------------------------
[1] 这个规律请读者自己证明(提示N/k,等于1, 2, 3, …, N中能被k整除的数的个数)。
相关推荐:
用AI写文章:效率与创意的完美结合
SEO外,如何提升网站整体营销效果?,文轩网络营销推广方案
ChatGPT启动时遇到问题?快速解决方案让你畅享智能对话体验,ai如何保存logo
SEO获客的秘诀:如何通过搜索引擎优化提升客户获取能力,厦门seo搜索优化排名
SEO但是,这些常见误区你真的知道吗?,凤岗网站建设开发
优化服务网-提升客户体验,打造全方位智慧服务平台,东莞网站建设员招聘信息
优化工具:提升工作效率的秘密武器,网站模板的优化策略是什么
AI免费工具:提升效率与创意的秘密武器
【SEO优化全攻略】提升网站流量的终极秘籍,带你轻松玩转搜索引擎优化!,金融网站推广维护
SEO舆情:如何通过有效的舆情管理提升企业品牌形象,seo推广外包提高收录
WP原创:打造属于你的独特网站,从这里开始!,一个网站推广一个月需要多少钱
智能AI写文章:高效创作新风尚
seo辅助词选什么,seo助手 ,各车企ai
优化公司:助力企业腾飞的秘密武器,微信营销推广价格多少
seo黑帽是什么,列举几种seo黑帽行为 ,穿老款的ai丢人吗
360刷排名工具选哪家?揭秘2025年最强排名优化工具!,ai写作网站哪个好一点
AI自动帮写,轻松应对内容创作挑战,赋能写作新未来,嘿科技ai
ChatGPT无法加载?检查您的网络设置并尝试重启,轻松解决常见问题!,ai招生广告设计
GPT-3.5可以免费使用吗?AI未来的无限可能,ai烧猪
文章自动生成AI:助力写作新时代,让创作更高效
SEO快速提升:让你的网站排名瞬间飙升的秘诀,网站建设的发展目标
OpenAI账号申诉怎么办?全方位解析解决方案,ai写作免费公众号下载
AI一键生成文章网页版,让内容创作更简单高效
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
SEO外链技巧:提升网站排名的秘密武器,ai视频生日祝福
OpenAI您的信用卡被拒绝了?请尝试用借记卡支付,轻松解决支付问题!,ai cdr缩略图补丁
SEO量:提升网站流量和排名的关键法则,德兴seo
seo要学什么技术,seo要学什么技术好 ,ai.fale
seo用什么写属性写,seo属于什么 ,芭田科学施肥AI
如何下载免费AI软件,让你的工作和生活更智能
SEO动态:2025年SEO趋势与优化技巧解析,十堰外贸网站推广费用
ChatGPT:基于Transformer技术的语言模型,开创人工智能未来,AI独战OK
整理文章的AI:提升写作效率的智能助手
OpenAIGPTChatSoraOpenAIChatGPT服务在中断数小时后已恢复,ai视图线稿
如何查文章AI率?全面解析AI文章检测工具及技巧
ChatGPT维护页面-背后的技术与用户体验,ai领域ppt
ChatGPTCanvex打不开?详细分析及解决方法助你顺利使用,ai2.5d网格线去除
中外链:打通全球流量的桥梁,提升网站排名与流量的双重保障,行业网站建设思路
ChatGPT360:全方位提升你的工作与生活效率,ai72787
AI免费生成文章让创作变得轻松自如
今时CMS:引领数字化转型的智慧之选,河南seo优化网站联系方式
ChatGPT198元永久会员,开启智慧之门,体验AI的极致服务!,老孙教ai
二创AI:打破创意壁垒,引领未来内容创作新潮流,背影教案网站建设游戏
如何选择适合你的AI工具?全面解析AI工具哪个好用
AI免费写文:创作新时代的高效助手
OpenAI无法验证支付方式?解决方案与常见问题解析,你好月光ai
OpenPose大白话解释:让你轻松理解姿态识别的神奇技术,ai天天晴
什么是亚马逊seo策略,亚马逊的seo推广是什么 ,天天学术ai写作优惠券
SEO要素:优化网站排名的关键因素全解析,棒球大联盟营销推广文案
ChatGPT显示503:如何应对AI服务不可用的困境?,ai宝贝宝贝