在VB里怎样进行大数据的高精度计算?如两个一百位的数字相乘。 UP有分

laisiwei 2002-11-30 02:40:16
在VB里怎样进行大数据的高精度计算?
如两个一百位的数字相乘。
怎样像Windows自带的计算器一样进行计算而不溢出?

如果没有满意的答案作送分帖;如果有答案,给回答者100分
...全文
575 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
laisiwei 2002-12-29
  • 打赏
  • 举报
回复
结帖
since1990 2002-12-22
  • 打赏
  • 举报
回复
十分关注!
conanzhang 2002-12-16
  • 打赏
  • 举报
回复
怎么不问我?呵呵~~~你在太平洋上问我一句啊,我有那7道题的答案的
RandomLife 2002-12-16
  • 打赏
  • 举报
回复
Dim Length As Integer
Dim a(1000) As Integer '阶乘结果
Dim b '将结果每五位取出来进行计算
Dim temp
Dim carry As Long '进位
Dim answer As String '得出的结果
Dim endNumber As Integer '要计算的阶乘

result.Caption = "计算中..."

If IsNumeric(inputNum.Text) = True Then '要计算的阶乘
endNumber = inputNum.Text
Else
endNumber = 1
End If

If endNumber > 1000 Or endNumber <= 0 Then
endNumber = 1
End If

Length = 5
a(0) = 1

For i = 1 To endNumber
carry = 0
For j = 0 To 199
b = a(j * Length + 4) & a(j * Length + 3) & a(j * Length + 2) & a(j * Length + 1) & a(j * Length)
b = CLng(b)

temp = b * i + carry '取出的五位数与i相乘并加上进位
If Len(temp) < 5 Then '不够五位,补零
temp = String(5 - Len(temp), "0") & temp
End If

For k = 0 To Length - 1 '计算后,改变结果
a(j * Length + k) = Mid(temp, Len(temp) - k, 1)
Next

If (b * i + carry) > 10 ^ Length Then '进位了,得出进位
temp = b * i + carry
carry = CLng(Left(temp, Len(temp) - 5))
Else '未进位,进位赋零
carry = 0
End If
Next
answer = ""
Next

For l = 0 To 999
answer = answer & a(999 - l)
Next

While Left(answer, 1) = "0" '去掉前面的0
answer = Right(answer, Len(answer) - 1)
Wend

If Len(answer) = 1000 Then
result.Caption = "所求阶乘超过1000位,只能显示结果的后1000位"
Else
result.Caption = "结果共" & Len(answer) & "位"
End If
factorial.Text = answer
''''''''''''''''''''''''''''''''''
'很早以前做得算阶乘的程序,看看吧
''''''''''''''''''''''''''''''''''
alfxiao 2002-12-16
  • 打赏
  • 举报
回复
up
shawls 2002-12-14
  • 打赏
  • 举报
回复
用数组-逐位加
oswica 2002-12-14
  • 打赏
  • 举报
回复
关注
Laney 2002-12-14
  • 打赏
  • 举报
回复
I want to know how to do it.
Laney 2002-12-14
  • 打赏
  • 举报
回复
up
laisiwei 2002-12-07
  • 打赏
  • 举报
回复
VB里有这个吗?
zyl910 2002-12-07
  • 打赏
  • 举报
回复
它用的是VC里的long double型


Type long double


The long double contains 80 bits: 1 for sign, 15 for exponent, and 64 for mantissa. Its range is +/–1.2E4932 with at least 19 digits of precision.
fraser01 2002-12-01
  • 打赏
  • 举报
回复
刚看到UP也有分,所一再帮你UP一下,怎么样,兄弟,够意思吧!
哈哈!
hityu 2002-12-01
  • 打赏
  • 举报
回复
具体算法,搜索一下试试吧。
hityu 2002-12-01
  • 打赏
  • 举报
回复
《高级程序员教程》中详细地讲了这个问题。

大致意思是:用1个byte代表长数据的一“位”(当然不是指bit)。
fraser01 2002-12-01
  • 打赏
  • 举报
回复
根据算法你可以得到:
2010*2211=2010*(2200+11)=2010*22*100+2010*11
=2*22*100*1000+22*10*100+2*11*1000+11*10=。。。
你可以发现一个4位数的乘法可以最终变成个位数乘法。
你的做法也是一样的,在获得数据后用STRING变量将数字放在相关位置就可以了。
hycao 2002-12-01
  • 打赏
  • 举报
回复
用数组。很多讲数据结构的书中一般会讲到这方面的内容,如求20以上的阶乘等。
zyl910 2002-12-01
  • 打赏
  • 举报
回复


好像的确用的是高精度算法
刚才测了一下
数字大的时候很慢
最大的支持10^43429
zyl910 2002-12-01
  • 打赏
  • 举报
回复
怎样像Windows自带的计算器一样进行计算而不溢出?
==================================================
指什么?

计算器好像不支持高精度运算吧

应该是指不出现溢出错误对话框吧





On Error 语句


启动一个错误处理程序并指定该子程序在一个过程中的位置;也可用来禁止一个错误处理程序。

语法

On Error GoTo line

On Error Resume Next

On Error GoTo 0

On Error 语句的语法可以具有以下任何一种形式:

语句 描述
On Error GoTo line 启动错误处理程序,且该例程从必要的 line 参数中指定的 line 开始。line 参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到 line,激活错误处理程序。指定的 line 必须在一个过程中,这个过程与 On Error 语句相同; 否则会发生编译时间错误。
On Error Resume Next 说明当一个运行时错误发生时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用 On Error GoTo。
On Error GoTo 0 禁止当前过程中任何已启动的错误处理程序。


说明

如果不使用 On Error 语句,则任何运行时错误都是致命的;也就是说,结果会导致显示错误信息并中止运行。

一个“允许的”错误处理程序是由 On Error 语句打开的一个处理程序;一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。控件返回调用的过程。如果调用过程有一个已启动的错误处理程序,则激活错误处理程序来处理该错误。如果调用过程的错误处理程序也是活动的,则控件将再往回传到前面的调用过程,这样一直进行下去,直到找到一个被允许的但不是活动的错误处理程序为止。如果没有找到被允许而且不活动的错误处理程序,那么在错误实际发生的地方,错误本身是严重的。错误处理程序每次将控件返回调用过程时,该过程就成为当前过程。在任何过程中,一旦错误处理程序处理了错误,在当前过程中就会从 Resume 语句指定的位置恢复运行。

注意 一个错误处理程序不是 Sub 过程或 Function 过程。它是一段用行标签或行号标记的代码。

错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发生的原因。在其它任何错误发生之前,或在调用一个可能会导致错误发生的过程之前,错误处理程序应该先测试或存储 Err 对象中相关的属性值。Err 对象中的属性值只反映最近发生的错误。Err.Description 中包含有与 Err.Number 相关联的错误信息。

On Error Resume Next 会使程序从紧随产生错误的语句之后的语句继续执行,或是从紧随最近一次调用含有 On Error Resume Next 语句的过程的语句继续运行。这个语句可以置运行时错误于不顾,使程序得以继续执行。可以将错误处理程序放置在错误发生的地方,而不必将控件传输到过程中的其它位置。在调用另一个过程时,On Error Resume Next 语句成为非活动的,所以,如果希望在例程中进行嵌入错误处理,则应在每一个调用的例程中执行 On Error Resume Next 语句。

注意 当处理在访问其它对象期间产生的错误时,与其使用 On Error GoTo 指令,不如使用 On Error Resume Next。每次和对象打交道,在不知道用代码访问哪个对象时,检查一下 Err 都会打消这种疑虑。可以确定是哪个对象产生错误(Err.Source 中指定的对象),也可以确定是哪个对象将错误代码放在 Err.Number 中。

On Error GoTo 0 停止在当前过程中处理错误。即使过程中包含编号为 0 的行,它也不把行 0 指定为处理错误的代码的起点。如果没有 On Error GoTo 0 语句,在退出过程时,错误处理程序会自动关闭。

在错误未发生的时候,为了防止错误处理程序代码运行,请像在下段程序中那样,在紧靠着错误处理程序的前面写入 Exit Sub、Exit Function 或 Exit Property 语句。

Sub InitializeMatrix(Var1, Var2, Var3, Var4)
On Error GoTo ErrorHandler
. . .
Exit Sub
ErrorHandler:
. . .
Resume Next
End Sub

此处,错误处理程序代码在 Exit Sub 语句之后,而在 End Sub 语句之前,从而与过程中的流程分开。错误处理程序代码可以在程序中的任何地方写入。

当对象作为文件运行时,对象中未捕获的错误都被返回控制应用程序。在开发环境中,如果设置了正确选项,未捕获的错误只返回控制应用程序。请参考主应用程序的文档的有关描述,从而得知,在调试时应该设置哪些选项、如何设置这些选项以及主机能否建立类。

如果建立一个访问其它对象的对象,则应该着手处理从那些对象返回的未处理错误。如果无法处理这种错误,请将 Err.Number 中的错误代码当作自己的一个错误,然后将错误回传给对象的调用者。应该将错误代码添加到 vbObjectError 常数上来指定这个错误。举例来说,如果错误代码为 1052,则使用如下方法指定错误:

Err.Number = vbObjectError + 1052

注意 调用动态链接库 (DLL) 期间产生的系统错误不会产生例外情况,也不会被 Visual Basic 的错误捕获操作所捕获。当调用 DLL 函数时,应该(根据 API 的详细说明)检查每一个返回值以确定是成功还是失败,如果失败,则检查 Err 对象的 LastDLLError 属性中的值。





On Error 语句示例
本示例先使用 On Error GoTo 语句在一个过程中指定错误处理的代码所在。本示例中,试图删除一已经打开的文件从而生成的错误码为 55。这个错误将由示例中的错误处理程序码来处理,处理完後,控制会回到发生错误的语句处。On Error GoTo 0 语句关闭错误陷阱。然后 On Error Resume Next 语句用来改变错误陷阱,以便发觉下一个语句产生的错误的范围。请注意示例中使用 Err.Clear 在错误处理完後,清除 Err 对象的属性。

Sub OnErrorStatementDemo()
On Error GoTo ErrorHandler ' 打开错误处理程序。
Open "TESTFILE" For Output As #1 ' 打开输出文件。
Kill "TESTFILE" ' 试图删除已打开的文件。
On Error Goto 0 ' 关闭错误陷阱。
On Error Resume Next ' 改变错误陷阱。
ObjectRef = GetObject("MyWord.Basic") ' 试图启动不存在
' 的对象
'检查可能发生的 Automation 错误。
If Err.Number = 440 Or Err.Number = 432 Then
' 告诉用户出了什么事。然后清除 Err 对象。
Msg = "There was an error attempting to open the Automation object!"
MsgBox Msg, , "Deferred Error Test"
Err.Clear ' 清除 Err 对象字段。
End If
Exit Sub ' 退出程序,以避免进入错误处理程序。
ErrorHandler: ' 错误处理程序。
Select Case Err.Number ' 检查错误代号。
Case 55 ' 发生“文件已打开”的错误。
Close #1 ' 关闭已打开的文件。
Case Else
' 处理其他错误状态 . . .
End Select
Resume ' 将控制返回到产生错误的语句。
End Sub

用户 昵称 2002-11-30
  • 打赏
  • 举报
回复
string就行
laisiwei 2002-11-30
  • 打赏
  • 举报
回复
那如果是一百位除以一百位呢?
加载更多回复(1)

7,785

社区成员

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

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