某数阶乘的尾数0的个数

某数阶乘的尾数0的个数


1;大数的阶乘后尾0的个数,求0的个数,让我们想到0就是由2,5的乘积组成,这里我为什么没有把10,100~~~等等,都出来而只单单说只是2,和5的乘积呢,我们先回忆一下,唯一分解定理。


2;唯一分解定理,
概念;任意一个大于0的正整数都能被表示成若干个素数的乘积且表示方法是唯一的;整理可以将相同素数的合并;可以得到

公式————n = P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn);(这就是标准分解式)


3;然而这是一个数的阶乘与我们这题求某个数阶乘没什么关系啊,

确实普通的唯一分解定理在这题中确实没有什么关系的,但是唯一分解定理也可以拓展,也就是标准式的另外一种形式,与阶乘有关的,


4;标准分解式的另外一种写法;

例如;求29阶乘的标准分解式;

不超过29的素数有哪些;2,3,5,7,11,13,17,19,23,29

就这么多了,然后我们要做什么呢,才可以求出29阶乘的标准分解式;就是要求出这些素数的幂是好多;


2(29!)//让它表示29阶乘的标准分解式中素数2的幂;其余类似;
先解释一下[a]是什么意思,表示小于a的最大整数
2(29!) = [29/2^1]+[29/2^2]+[29/2^3]+[29/2^4]

= 14+7+3+1=25;

25就表示29阶乘的分解式中素数2的个数;

应该有人有疑问,为什么只加到29/2^4不在继续加呢,这里有什么特殊的,只加到这里。当然有特殊的29/2^4=1;如果继续加也是0啊;因此就加到[29/2^x]==1这里;
其余也是这样
3(29!)= [29/3^1]+[29/3^2]+[29/3^3]=13;
其余都是这样的套路可以算出标准式中小于等于29的素数的个数

可以得出;


29!= 2^25 * 3^13 * 5^6 * 7^4 * 11^2 * 13^2 * 17^1 * 19^1 * 23^1 *29^1;这就是拓展唯一分解定理得到的结果;

我们已经把29!的分解式已经求出来了,我们现在可以看出29!尾数0的个数吗;答案就是6;


5;慢慢的就开始于题目有关了吧;最开始就说过尾数0都是由2和5组成的。意思就是说我们只要把这个数阶乘的拓展标准分解式中2和5的个数求出来,那么0的个数就是2和5个数中小的那个;
是不是突然间恍然大悟了;

然而就可以敲代码了;如何把算法代码化就要看现在了;

#include<stdio.h>
#include<math.h>
int main()
{
int n, i, sum2, sum5, kk, k;
while(scanf("%d",&n) != EOF){
sum5 = 0;
sum2 = 0;
k = n/2;
while(k != 0){//求标准式中素数2的个数 
sum2 += k;
k = k/2;
}
kk = n/5;
while(kk != 0){//求标准式中素数5的个数 
sum5 += kk;
kk= kk/5;
}
if(sum2 < sum5){
printf("%d\n",sum2);
}
else printf("%d\n",sum5);
}

return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值