计算阶乘n!末尾所含0的个数

问题描述
给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数。
例如,5!=120,其末尾所含有的“0”的个数为1;10!= 3628800,其末尾所含有的“0”的个数为2;20!= 2432902008176640000,其末尾所含有的“0”的个数为4。

计算公式
这里先给出其计算公式,后面给出推导过程。
令f(x)表示正整数x末尾所含有的“0”的个数,则有:
   当0 < n < 5时,f(n!) = 0;
   当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。

问题分析
显然,对于阶乘这个大数,我们不可能将其结果计算出来,再统计其末尾所含有的“0”的个数。所以必须从其数字特征进行分析。下面我们从因式分解的角度切入分析。

我们先考虑一般的情形。对于任意一个正整数,若对其进行因式分解,那么其末尾的“0”必可以分解为2*5。在这里,每一个“0”必然和一个因子“5”相对应。但请注意,一个数的因式分解中因子“5”不一定对应着一个“0”,因为还需要一个因子“2”,才能实现其一一对应。

我们再回到原先的问题。这里先给出一个结论:
结论1: 对于n的阶乘n!,其因式分解中,如果存在一个因子“5”,那么它必然对应着n!末尾的一个“0”。
下面对这个结论进行证明:
(1)当n < 5时, 结论显然成立。
(2)当n >= 5时,令n!= [5k * 5(k-1) * ... * 10 * 5] * a,其中 n = 5k + r (0 <= r <= 4),a是一个不含因子“5”的整数。
对于序列5k, 5(k-1), ..., 10, 5中每一个数5i(1 <= i <= k),都含有因子“5”,并且在区间(5(i-1),5i)(1 <= i <= k)内存在偶数,也就是说,a中存在一个因子“2”与5i相对应。即,这里的k个因子“5”与n!末尾的k个“0”一一对应。
我们进一步把n!表示为:n!= 5^k * k! * a(公式1),其中5^k表示5的k次方。很容易利用(1)和迭代法,得出结论1。

上面证明了n的阶乘n!末尾的“0”与n!的因式分解中的因子“5”是一一对应的。也就是说,计算n的阶乘n!末尾的“0”的个数,可以转换为计算其因式分解中“5”的个数。

令f(x)表示正整数x末尾所含有的“0”的个数, g(x)表示正整数x的因式分解中因子“5”的个数,则利用上面的的结论1和公式1有:
   f(n!) = g(n!) = g(5^k * k! * a) = k + g(k!) = k + f(k!)
所以,最终的计算公式为:
当0 < n < 5时,f(n!) = 0;
当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。

计算举例
f(5!) = 1 + f(1!) = 1
f(10!) = 2 + f(2!) = 2
f(20!) = 4 + f(4!) = 4
f(100!) = 20 + f(20!) = 20 + 4 + f(4!) = 24
f(1000!) = 200 + f(200!) = 200 + 40 + f(40!) = 240 + 8 + f(8!) = 248 + 1 + f(1) =249
...

 

 

2008! = 864364185767107020525555785744913866947705402855234129109030596928161811
30349289654529502697509195384231172407798480676210473050254653691699885279619245
95282259401273439081245874835327256481869830604046872668665535525324052381293501
57966948127554609294966898648555268016524062496297607783419200275359981112108455
85964312245693430012395000661489449928161006308033871728370145842246861435772708
33503862200508826573800166011068653824559144279224109587122851968383695522166659
10823010007114025783166152459125033034810634843601942911554750952514795325689852
01843715592475296563523965687904014012277135693563336958691836319444117997054946
85023371202943497849573399009022642650218658920509219870642049135908426617170399
68938029081887572750037054519668987544266265405040228775913400135373608163926252
85550205556674469154535014420626307845473997558226565852647783174137467009137094
59339385751374862604274354598201169640634514444139944655102100737742939802758802
50784149026189258771741091787136165858838131274412158177445379848553987227287318
35030978830425196401370289991477269886035396799071879482695065001236211551469108
13025614597551287814406443483433437308671059084571075135822060243761817058914294
76882833817846566398722449352555668276644605084799757015795294347576420656789473
95386984845744346685582774364492480219196423141762909953312579045507499275924487
17204785068889390480549695110671357342620580497478727596286312261464984651347795
65827669569067730492908605207384595171362920907706805939480105059960681023739479
36258241209566250186095013872603462999109326053258345530862617052441013778446303
28793699179176374298473936138092462327728033178830353836075930434485894125748801
90306053365897329505756043428179920712197945273706408611232383017307444018485459
40145960901606555558946416648902885833103387278242425171929954205560372493987394
26364459429823504618527663055342825321495727192596238131050111409064252459339972
04272802648402546000121760863277457591641301166924298806452499256745265725345061
35896743526501234409624632090110527982616742323819443555752358238517825021925542
07329013332066802048771787062030658895164543415003624617078166405481328213194716
83115509678587192166651607674890749711987448761069193366805844736137727178559919
69058562481629694565905839682691742925454042012086650317697125503855691538838461
03576448134780323963509879547317751290661148443126308299449519549837786372160989
04441275035722077001533915518501363056080352226142913805840505370561197494768160
87800085245882225242031698925903699326408071302699879908568007093205806603442944
96186197305445225936764110875312864755366210177725244840127559088424076199528718
19633398499561006182240185690626746755297099234319071949906381168017171986012853
38686641138617095674661597070763512310914724726885367302158783017861151308558718
64204762656720287905955132053380798470390079176098911594105563661565798237382533
52146953445138767397782041126496738798636606634442630262261696513417946933965164
54208886956564801050963513875083227186461611789287959865051487896052042016184267
43416179555547857326232973016802540848310081831069927926917863779098655803317629
31015270317184605723983309184499442459302097239277586929716173938946244591373719
62064966418709908292002436251528962853185187569850000279031611239980870151403162
68999938323527012195240924499877946136983459145255013025426891680326054850873327
80350825308762888796876458287695397527715477006159223525722034913417217412563626
07822359501863305940628945023919326327437252032293952678761393051391203518166386
00619944426312868930887466078693260266706883214852619802473893839624677974984490
48536486309775220630138651944174680437865013560342519229140167073572046207641535
68601821272169208957251576372861357091345967702160527466166478955380088730675601
45920520663426978607723535061523576062603932595002590772916409505831439681485614
82349363604163330329889444061601312369122943826939962160393707535607018615956978
79975938657188335301827507508063645396334348681402713815806614829629274666329563
01306147995413505497351542603693650167796159236715536802438145089125132541047720
53963270177752564919466470757207792563425677319285091229123330445251057126988801
92889400166721123125103407568627276005753706590784666942672410697818381317060772
52316452257163591310887953106600354473516249471302120440926066073985272690907695
89105280047448566016254494912513629027564171920301337782184708332062997016401761
32133643851413170004909388617805775572654075230351717777713864837969537814491762
74130751100889633055140316767928472059082681796963653691037727121914182766830576
31715015548207215809341517152427724526962705788814625638884232527066664257545092
63011477580486648310418050276983946893813040436904052974195883249053853674931443
28955568614817793362584467811936189210507222432246380775128285421761016768314613
66851696059162047807583199523000843218715449137876797926691962136892186412560621
63432971676954007227178698431081344335589082515718828012892951669544226914300286
83831764580081721367238692903135428898911229632240920378516525484256691646951322
31381343781375187744079090238006092312682758648276401242138945390549531008004699
52255731863332460263060949662017734372213076687369778402830809043730023746066167
83652310114970707230303313280053798864118475140009150456037527582146560000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000

 

C++:

#include <iostream>
using namespace std;
int countzero(int st,int dt)
{
int count=0;
int i;
for (i=st;i<=dt;++i)
{
int temp=i;
while (temp%5==0)
{
++count;
temp/=5;
}
}
return count;
}
int main()
{
int n;
cout<<"请输入n"<<endl;
cin>>n;
cout<<countzero(1,n)<<endl;
system("PAUSE");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目中的$b_n$的定义是$n$的阶乘,即$b_n=1*2*3*\cdots*n$。已知$b_3!=6$,$b_5!=120$,而$n!$的末尾会有很多个0,现在我们统计$n!$去除末尾的0之后最后有多少个0。注意到10是由$2*5$得到的,因此我们只需要统计$n!$中2和5的个数,然后取两者的最小值,即为$n!$末尾0的个数。显然2的个数远大于5的个数,因此我们只需要计算$n!$中5的因子个数。依次分别除以5,25,125……,并对每次得到的商进行累加即可。具体来讲,设$f(n)$表示$n!$中5的因子数,则有: $$f(n)=\left\lfloor \frac{n}{5}\right\rfloor +\left\lfloor\frac{n}{25}\right\rfloor+\left\lfloor\frac{n}{125}\right\rfloor+\cdots$$ 现在我们来看一下最后一个问题,即求$n!$除以末尾的0之后最后有多少个非0数字。很明显,这就是要求$n!$除以10之后最后一位非0数的个数,而这个数可以看成是$n!$中质因数2和5的个数之间的最小值。根据之前的计算,$n!$中5的因子数即为$n!$末尾0的个数,那么质因数2的个数又可以通过类似的方法来计算,即 $$g(n)=\left\lfloor \frac{n}{2}\right\rfloor +\left\lfloor\frac{n}{4}\right\rfloor+\left\lfloor\frac{n}{8}\right\rfloor+\cdots$$ 综上所述,我们只需要求出$f(n)$和$g(n)$,然后取两者的最小值即可。同时,注意到$f(n)$和$g(n)$都可以用对数的形式表示,具体来讲,有: $$f(n)=\sum_{i=1}^{\infty}\left\lfloor\frac{n}{5^i}\right\rfloor,\quad g(n)=\sum_{i=1}^{\infty}\left\lfloor\frac{n}{2^i}\right\rfloor$$

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值