阶乘数未尾零的个数

来源:互联网 发布:怎样下载photoshop软件 编辑:程序博客网 时间:2024/04/29 23:46

阶乘数未尾零的个数


n!未尾共有多少个零?编制程序对于n=100,1000,10000解决上述问题。
设n!素因子表示中素数p的幂为Pof(n,p) ,则
Pof(n,p)=[n/p]+[n/p^2]+……
显然
Pof(n,5)< Pof(n,2)
所以,n!未尾零的个数为Pof(n,5)。例如,
Pof(100,5)=[100/5]+[100/25]=20+4=24
Pof(1000,5)=[1000/5]+[1000/25]+[1000/125]+[1000/625]=200+40+8+1=249
Pof(10000,5)=[10000/5]+[10000/25]+[10000/125]+[10000/625]+[10000/3125]
=2000+400+80+16+3=2499
注意到[[n/p^k]/p]=[n/p^(k+1)],计算pof(n,p)的程序为:
int pof(int n, int p)
{
    int pow=0;
    while (n > 0)
    {
        n = n / p;
        pow += n;
    }
    return pow;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
计算pof(n,p)的公式
pof(n,p)有下面的计算公式:
pof(n,p)=(n-sod(n,p))/(p-1)
sod(n,p)表示n的p进制表示的数字和。
证明:设n=(b[k-1]b[k-2]…b[1]b[0])_p=b[k-1]p^(k-1)+b[k-2]p^(k-2)+…+b[1]p+b[0]
[n/p]= b[k-1]p^(k-2)+b[k-2]p^(k-3)+…+b[2]p+b[1]
[n/p^2]= b[k-1]p^(k-3)+b[k-2]p^(k-4)+…+b[2]
……
[n/p^(k-1)]= b[k-1]
从而,
pof(n,p)
=[n/p]+[n/p^2]+……
=(p^(k-2)+p^(k-3)+…+1)b[k-1]+
(p^(k-3)+p^(k-4)+…+1)b[k-2]+……+(p+1)b[2]+b[1]
=(p^(k-1)-1)b[k-1]/(p-1)+(p^(k-2)-1)b[k-2]/(p-1)+…+(p^2-1)b[2]/(p-1)+(p-1)b[1]/(p-1)
=(p^(k-1)b[k-1]+p^(k-2)b[k-2]+…+pb[1]+b[0]-b[k-1]-b[k-2]-…-b[1]-b[0])/(p-1)
=(n-sod(n,p))/(p-1)
例如,
(1) 100=20*5+0,20=4*5+0,从而100=(400)_5,pof(100,5)=(100-sod(400))/4=24
(2) 1000=200*5+0,200=40*5+0,40=8*5+0,8=1*5+3,从而1000=(13000)_5,pof(1000,5)=(1000-sod

(13000))/4=249
(3) 10000=2000*5+0,2000=400*5+0,400=80*5+0,80=16*5+0,16=3*5+1,从而10000=(313000)_5,

pof(10000,5)=(10000-sod(310000))/4=9996/4=2499
(4) 1998=399*5+3,399=79*5+4,79=15*5+4,15=3*5+0,从而1998=(30443)_5,pof(1998,5)=(1998-

sod(30443))/4=(1998-14)/4=1984/4=496
~~~~~~~~~~~~~~~~~~~~~~
阿拉伯数
求一个素数n,使得n!末尾恰有1001个零。这样的素数称为阿拉伯数.

1001=(n-sod(n,5))/4
可知
n=4004+sod(n,5)>4004
n=4005时,pof(4005,5)=[4005/5]+ [4005/25]+ [4005/125]+ [4005/625]+ [4005/3125] =

801+160+32+6+1=1000.
对于4005<n<4010,均有pof(n,5)=1000.
对于4010≤n<4015,均有pof(n,5)=1001.其中4013为素数. 故阿拉伯数为4013.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可以进一步考虑在其它进制中n!未尾零的个数的问题