标题:各位老师好!求助编辑一个大整数的快速乘除法可调用程序
只看楼主
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 109楼 xianfajushi
谢谢您!欢迎有空再弄,辛苦了!
2020-02-23 13:37
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
要那么多位干嘛?家用电路又不是超级计算机!
只设计到提供的最大位数据,几万位走一遍都要花费很多时间,就如马拉松与短跑。
以下是引用ysr2857在2020-2-23 13:36:12的发言:
所谓的快速法就是前面的判断素数的程序,可以计算几十位几百位的大整数。当然计算孪生素数对不需要这么大的数据,但也是超过了11位,朋友要的,不知道要算到多少位。我的要求是能算上千万位的超大整数的,最低也是几万位的。

2020-02-23 14:00
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 112楼 xianfajushi
是的,我的程序仅能算到2万位再大就溢出,时间长,一步2万位的乘法或除法要几十分钟甚至一个小时,高手可以做到毫秒级的,没人指导我。
谢谢您!你的程序已经很快了,不知道能算几万位的不能?
2020-02-23 14:29
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
目前没有,如果你有了希望能分享我一个。代码已经写好了,看我博客。
64位数据应该可以运算,这是系统和软件提供的最大范围。


[此贴子已经被作者于2020-2-23 16:08编辑过]

2020-02-23 16:03
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
这个论坛老是出现回复2次的!

[此贴子已经被作者于2020-2-23 16:07编辑过]

2020-02-23 16:03
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
好的,非常感谢!我试试能算多大的。谢谢!我找到的乘法除法程序都是vc版的,您能解释一下吗?前面有一个乘法的程序?
有空再弄!谢谢您!
2020-02-23 16:29
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
您的程序我没法用,不是vb版的,和我的vb6.0不兼容?多条语句变成了红字,无法改,提示是缺少结束语或缺少表达式。
2020-02-23 16:54
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
哦,那你还的练练,VB6与语句区别很大?看懂程序就按程序逻辑自己写。
2020-02-23 17:23
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
谢谢!我向你学习,学习学习这个程序!
下面是网上搞到的加减法程序,0是加法,1是减法,速度比我的程序快一点好象,时间是此程序为E-03,我的程序时间是E-02,相同的数据,是差一个小数点吧?
Private Sub Command1_Click()
Dim t As Double
t = Timer
Text3 = js(Trim(Text1), Trim(Text2), 0)
Text4 = Timer - t
End Sub

Private Sub Command2_Click()
Dim t As Double
t = Timer
Text3 = js(Trim(Text1), Trim(Text2), 1)
Text4 = Timer - t
End Sub

Private Sub Command3_Click()
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
End Sub

'2个长整数的加减法运算(最大长度无限)
Function js(num1 As String, num2 As String, mType As Integer) As String
Dim a1 As String, a2 As String
Dim s1() As String, S2() As String, Resu() As String
Dim I As Integer, J As Integer, k As Integer, Tmp As String
Dim t1 As Integer, t2 As Integer, JW As Integer, Fh As String
If Not IsNumeric(num1) Or Not IsNumeric(num2) Then
MsgBox "参于运算的只能是数字,不能含有其他字符", vbCritical, "错误提示"
Exit Function
End If
If Len(num1) < Len(num2) Or (Len(num1) = Len(num2) And Left(num1, 1) < Left(num2, 1)) Then
a1 = num2
a2 = num1
Fh = IIf(mType = 1, "-", "") '减法运算出现负数的情况
Else
a1 = num1
a2 = num2
End If
I = Len(a1)
J = Len(a2)
ReDim s1(I - 1), S2(J - 1)
ReDim Resu(IIf(mType = 0, I, I - 1))
For k = Len(a1) To 1 Step -1 '把数a1逐个放入数组s1
s1(I - k) = Mid(a1, k, 1)
Next
For k = Len(a2) To 1 Step -1 '把数a2逐个放入数组s2
S2(J - k) = Mid(a2, k, 1)
Next
JW = 0
For k = 0 To UBound(Resu) '从个位数开始相加减,结果入入数组resu
If k > UBound(s1) Then
t1 = 0
Else
t1 = Val(s1(k))
End If
If k > UBound(S2) Then
t2 = 0
Else
t2 = Val(S2(k))
End If
Select Case mType
Case 0 '加法运算
Tmp = t1 + t2 + JW
If Len(Tmp) > 1 Then
JW = Val(Left(Tmp, Len(Tmp) - 1))
Else
JW = 0
End If
Tmp = Right(Tmp, 1)
Case 1 '减法运算
I = t1 + JW - t2
If I < 0 Then
Tmp = I + 10
JW = -1
Else
Tmp = I
JW = 0
End If
End Select
Resu(k) = Tmp
Next
J = UBound(Resu)
For i = 0 To j '合并数组resu,结果输出到js1
js = js & Resu(J - I)
Next
For i = 1 To Len(js) '去掉前面的0
If Mid(js, I, 1) > "0" Then Exit For
Next
js = Fh & Mid(js, I)
If Len(js) = 0 Then
js = 0
Else
js = js
End If
End Function


[此贴子已经被作者于2020-2-23 19:03编辑过]

2020-02-23 18:52
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
略看了这个程序,有点累赘,可优化,有可能提高速度。
而且还有错误
        For i = 0 To j '合并数组resu,结果输出到js1
            js = js & Resu(J - I)js是函数名,是js1还是js?
        Next

[此贴子已经被作者于2020-2-23 20:07编辑过]

2020-02-23 19:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499181-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.642714 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved