raise importerror:求1000!后边的0的个数

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/27 15:53:59
用pascal 求1000!后边的0的个数 光有算法也可以 应该不是很困难(比如说先算出1000!什么的bt) 谢谢
是1000!那个数所含的0的个数 比如说933660014000 有5个零 是在不行就算最后边有几个零
5 & 10 的个数 好像没那么简单 到25又会增加一个0 到了后来说不定哪里有其他组合 继续增加0的个数 比如说 100! 后边有24个0 只算5 &10的话 只有20个
每25递增一个地话 就是 24 但是400!后边有99个0 就算加上 25递增的也不够 还有每×递增的规律把

呵呵,只有2*5或10的倍数后面有0的
剩下的你自己想了!很简单
或是用数位变换,即把数除以10,取整数部分
除以10整除而加1

末尾有几个零,只要看看这些数中一共有几个质因数5就好了。
1、有四个5的数:625
2、有三个5的数:125、250、375、500、750、875、1000(此处不再算625了)
3、有两个5的数:25、50、75、……、975(以上两类不再计入此处)
4、有一个5的数:5、10、15、……、995(以上三类不再计入此处)
第一类1个数,共4个5
第二类7个数,共21个5
第三类32个数,共64个5
第四类160个数,共160个5
合计共有249个5,那么1000!的末尾就有249个0.

25=5*5 100=10*10 50=5*10 75=3*5*5 这些5跟10的组合 须按 2个来算,共24个0

其实只要算出每个数中含有因子5的个数,他们的和就是阶乘最后0的个数。

我编了个程序如下:
#include "stdio.h"
#include "math.h"

main()
{ int n=1,s=0;
int i=0,k=0;
while(n<1001)
{ i=n;
while(i%5==0)
{ k++;
i=i/5;
}
n++;
}
printf("\n k=%d",k);
}

这样1000!最后零的个数为 249个

补充:
输入:
输出:k值,也就是后面0的个数
算法:
1 变量初始化:n=1,s=0,i=0,k=0;
2 当n小于1001时,执行第三步,当n大于等于1001时,跳转执行第8步
3 将n值赋给i
4 当i能够被5整除时,跳转到执行第5步,当i不能够被5整除时,跳转到执行第7步
5 k自加一
6 对i模5后赋值给i,跳转执行第4步;
7 n自加一,跳转执行第2步
8 输出 K 的值

我自己用pascal编了一个 但是很麻烦 din_go能详细说说算法么 ?
program good;
var
a,x,i,n,s:integer;
begin
read(n);
x:=1;i:=1;s:=0;
while exp(x*ln(5))<=n do
x:=x+1;
while i<=x do
begin
a:=n div trunc(exp(i*ln(5)));
s:=s+a;
i:=i+1
end;
writeln(s);
end.

求全部0的个数是可能的,其实换一个角度就是精确地求大数的阶乘的问题。只要精确地计算出了1000!,再去数一下0的个数就可以了。

1000!中,所有0的个数是472个,从后面算起0的个数是249个。

大家可以进入VB去算一下,下面是源程序:
Option Explicit

Private Sub calcfactorial(ByVal n As Integer)
Dim I As Long, J As Long, K As Long
Dim XYS() As Integer, x() As Integer, y() As Integer, result() As String
Dim factorial As String, TEMP As Long, stimer As Double
If n < 0 Then Exit Sub
ReDim x(1)
ReDim XYS(1)
x(1) = 1
XYS(1) = 1
K = 1
stimer = Timer
Do While K <= n
TEMP = Len(CStr(K))
ReDim y(1 To TEMP)
For I = 1 To TEMP
y(I) = Val(Mid(K, TEMP + 1 - I, 1))
Next
ReDim XYS(1 To UBound(x) + UBound(y))
For I = 1 To UBound(x)
For J = 1 To UBound(y)
XYS(I + J - 1) = XYS(I + J - 1) + x(I) * y(J)
Next
Next
For I = 1 To UBound(x) + UBound(y) - 1
TEMP = XYS(I) \ 10
XYS(I) = XYS(I) Mod 10
XYS(I + 1) = XYS(I + 1) + TEMP
Next

x = XYS
If x(UBound(x)) = 0 Then ReDim Preserve x(1 To UBound(x) - 1)
K = K + 1
Loop
ReDim result(1 To UBound(x))
For I = 1 To UBound(x)
result(I) = x(UBound(x) + 1 - I)
Next

factorial = Join(result, "")
Text1 = Text1 & factorial
Dim Tmp As String, Tmp1 As Long
Tmp1 = 0
For I = 1 To Len(factorial)
Tmp = Mid(factorial, I, 1)
If Tmp = "0" Then Tmp1 = Tmp1 + 1
Next
Label1 = "0的个数是" & Tmp1
Tmp1 = 0
For I = Len(factorial) To 1 Step -1
Tmp = Mid(factorial, I, 1)
If Tmp <> "0" Then Exit For
Tmp1 = Tmp1 + 1
Next
Label1 = Label1 & ",从后面算起0的个数是" & Tmp1
Erase x()
Erase y()
Erase XYS()
Erase result()
End Sub

Private Sub Command1_Click()
calcfactorial 1000
End Sub