N!中素因子p的个数 【数论】

本文介绍了一个计算N!中特定素因子p的幂次的有效算法,并通过示例解释了其工作原理。此外,还对比了两种不同的实现方式,指出了更优的写法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求N!中素因子p的个数,也就是N!中p的幂次

公式为:cnt=[n/p]+[n/p^2]+[n/p^3]+...+[n/p^k];

例如:N=12,p=2

12/2=6,表示1~12中有6个数是2的倍数,即2,4,6,8,10,12

12/2^2=6/2=3,表示1~12中有3个数是4的倍数,即4,8,12,它们能在提供2的基础上多提供一个2

12/2^3=3/2=1,表示1~12中有1个数是8的倍数,即12,它能在提供两个2的基础上又多提供一个2

代码为:

 

1 int cnt=0;
2 while(N){
3     cnt+=N/p;
4     N/=p;
5 }

 

刚开始一直不懂代码为什么这么写,其实就是当第一次算完n/p后,下一次需要算n/(p*p)=(n/p)/p,即上面写法。这是一个最好的写法,我本来想这么写:

1 //错误写法
2 int cnt=0;
3 while(N>=p){
4     cnt+=N/p;
5     p*=p;
6 }

显然,每次N除的是p的幂次,但是每次p*=p时,p是会变的,也就是每次除的并不是p的依次递增的幂次,可以改成这样:

1 int cnt=0;
2 int t=p;
3 while(N>=p){
4     cnt+=N/p;
5     p*=t;
6 }

 参考博客:https://www.cnblogs.com/dilthey/p/7588382.html

转载于:https://www.cnblogs.com/zxhyxiao/p/8026280.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值