急!一道vb面试题目,在线等待!

Rainbow686 2003-12-30 11:21:33
实现10000的阶乘(即10000!=?),运行程序的结果以10进制保存至文件factorial.txt。

求源代码!
...全文
87 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2003-12-30
  • 打赏
  • 举报
回复
上面的程序实现了计算阶乘,并将结果直接显示在textbox中,要想保存为文件,只要这样就可以了:
dim filename as string
filename="c:\test.txt"
open filename for binary as #1
put #1,,text1.text
close #1
northwolves 2003-12-30
  • 打赏
  • 举报
回复
采用字符串的运算,我前些天写的,比较慢,要耐心啊(你存成文本文件就可以了):

Function factorial(ByVal n As Long) As String
Dim XYS() As String, xl As Long, yl As Long, i As Long, j As Long, k As Long, TEMP As Long, MULTI As String
If n < 0 Then Exit Function
factorial = "1"
If n > 1 Then
k = 1
Do While k <= n
xl = Len(Trim(factorial))
yl = Len(Trim(k))
ReDim XYS(1 To xl + yl) As String
For i = 1 To xl
For j = 1 To yl
XYS(i + j) = CStr(Val(XYS(i + j)) + Val(Mid(factorial, i, 1)) * Val(Mid(k, j, 1)))
Next
Next
For i = xl + yl To 2 Step -1
TEMP = Val(XYS(i)) \ 10
XYS(i) = Val(XYS(i)) Mod 10
XYS(i - 1) = Val(XYS(i - 1)) + TEMP
Next
If XYS(1) = "0" Then XYS(1) = ""
factorial = Join(XYS, "")
Erase XYS
k = k + 1
Loop
End If
End Function

Private Sub Command1_Click()
x = "1000! = " & Trim(factorial(1000))
Text1 = x
End Sub



rainstormmaster 2003-12-30
  • 打赏
  • 举报
回复
求大数阶乘的通用函数(不会溢出)
--------------------------------------------------------------------------------
作者:周军 类别:VB技巧 日期:2002.09.11 08:39

一个通用函数,可计算任意大数的阶乘(不要太大哟),返回的是字符串。在我的 C2 1G,128MB SD,win98,vb6 环境下计算1000!,只用了4秒。
Text1用于显示结果,Text2用于输入要阶乘的数(比如1000),再按Command1就行了!
另有Label1、Label2、Label3可看到一些中间过程。
这段还有点提速的余地,比如:用静态数组换掉动态数组,但录活性差多了。
用这程序测速不错,看看我的测试
1000! 4秒
2000! 21秒
3000! 59秒
5000! 156秒
不试了已有16330位数了,光输出结果就用去了4秒。
对了,本来输入我是用循环:text1=text1 & cstr(result(i)) 方式的,一用吓了一跳,光1000!阶乘那2568位数就用了差不多一分钟才输完,看来字符串累加的方法千万要少用为妙。我这里的转换方法,大家可借鉴,至少在1000!时提速了一千倍!!!

Option Explicit
Dim incl As Boolean, starttime As Long
Private Function cacl(num As Long) As String
Dim flag As Long, numlen As Long, last As Long
Dim x As Long, k As Long, i As Long, m As Long, n As Long, j As Long
Dim result() As Long, tmp1() As Long, tmp2() As Long, s() As String
numlen = 1
ReDim result(1 To numlen)
result(1) = 1
x = 0
Do While incl = True And x < num
x = x + 1
flag = x
i = 0
Do
i = i + 1
last = flag Mod 10 '取出被乘数的最后一位
flag = flag \ 10 '去掉乘数的最后一位
tmp1 = result
n = 0
For k = 1 To numlen
m = tmp1(k) * last + n '用每一位数与上次结果数组中的每个数相乘并加上进位的数
tmp1(k) = m Mod 10 '取出最后一位并加入临时结果数组
n = m \ 10 '两个小于10的数相乘最多两位,这里取出进位数
Next
If n > 0 Then '处理最后一个进位数
ReDim Preserve tmp1(1 To numlen + 1)
tmp1(numlen + 1) = n
End If
If i = 1 Then
tmp2 = tmp1 '用第二个临时数组保存每次个位数乘出来的结果
Else
n = 0 '下面把本次乘出来的临时数组与上次乘出来的临时结果错位相加(就象乘法算式一样)。
j = UBound(tmp1) + i - 1
If UBound(tmp2) < j Then ReDim Preserve tmp2(1 To j)
For k = i To j
m = tmp2(k) + tmp1(k - i + 1) + n
tmp2(k) = m Mod 10
n = m \ 10
Next
If n > 0 Then
ReDim Preserve tmp2(1 To j + 1)
tmp2(j + 1) = n
End If
End If
Loop While flag > 0
numlen = UBound(tmp2)
result = tmp2
Label1 = x '下面三句可用Label1与Label2计算进度,并及时更新
Label2 = numlen
Label3 = Timer - starttime
DoEvents
Loop
k = UBound(result)
ReDim s(1 To k)
For i = k To 1 Step -1
s(k - i + 1) = CStr(result(i))
Next
cacl = Join(s, "")
End Function

Private Sub Command1_Click()
Dim i As Long
If incl = False Then
Command1.Caption = "看看结果"
incl = True
starttime = Timer
Text1 = cacl(CLng(Text2))
Else
incl = False
Command1.Caption = "再算一次"
End If
End Sub


Huaraco 2003-12-30
  • 打赏
  • 举报
回复
要用高精度运算。用string类型,分部计算。
809982 2003-12-30
  • 打赏
  • 举报
回复
高程教程(95)有此类源码
null1027 2003-12-30
  • 打赏
  • 举报
回复
我的思路(比较笨的办法):
建一个数组,long类的,每一个元素存一位结果数字,建一个变量存储结果的位数
首先为它初始化一个数字进去,比如10000吧,就把数组的第n个元素赋值为该数字的第n位,
然后就用循环求结果,每做一次乘法的时候就用该乘数对这个数组的每一个元素做乘法,然后算进位。
Rainbow686 2003-12-30
  • 打赏
  • 举报
回复
up
cenyfly 2003-12-30
  • 打赏
  • 举报
回复
太牛了!
liyan010 2003-12-30
  • 打赏
  • 举报
回复
save
Ranma_True 2003-12-30
  • 打赏
  • 举报
回复
mark
ffb 2003-12-30
  • 打赏
  • 举报
回复
你难道正在面试?得到了答案你知道原理吗?
onlineboy 2003-12-30
  • 打赏
  • 举报
回复
同意楼上的,这就是简单的浮点算法
要更详细的,随便找本数学算法的书上都有
northwolves 2003-12-30
  • 打赏
  • 举报
回复
rainstormmaster(rainstormmaster) 提供的函数是快得多,看来运算时要养成用数组替换字符串的习惯。

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧