|
一款可瞬间判定素数的神奇小软件
[这个贴子最后由天山草在 2008/10/08 07:41pm 第 2 次编辑]
';商为整数及小数的大数相除,可调用
';2008-10-08 版
Private Sub form_Click()
Open "相除结果.txt" For Output As #1
Dim a1(1000) As Long ';……………… 被除数的各位数字
Dim ay(1000) As Long ';……………… 余数的各位数字(最后一次试商要修正时)
Dim ayy(1000) As Long ';………………余数的各位数字(最后一次试商不必修正时)
Dim b1(1000) As Long ';……………… 除数的各位数字
Dim c1(1000) As Long ';……………… 近似商与除数相乘后的各位数字
Dim d(10) As Long
Dim aa1 As String ';作为被除数的输入字符串
Dim bb1 As String ';作为除数的输入字符串
Dim pp As String ';商的每一位
Dim ppp As String ';作为商的输出字符串
Dim s1(1000) As Long ';……………… 商的各位数字
Dim js As Long '; js 是商的位数加一
Dim ta, tb, j, e As Long
Dim fa As Long ';………………………… 被除数的位数
Dim fb As Long ';………………………… 除数的位数
aa1 = "324518553658426726783168636188160"
bb1 = "324518553658426726783156020576256"
';商 = 1.00000000000000000000003887485557229067298154974417
Print "被除数 = "; aa1: Print #1, "被除数 = "; aa1
Print " 除数 = "; bb1: Print #1, " 除数 = "; bb1
Print " 商 = ";: Print #1, " 商 = ";
GoSub sub1
Print ppp: Print #1, ppp
999: Close
Exit Sub
sub1:
Z = 50 ';需要计算的小数位数
pp = "": ppp = "": mv = 0
If Len(bb1) <= 2 Then aa1 = aa1 + "00": bb1 = bb1 + "00" ';除数小于 3 位时
mv = 0
If Val(aa1) < Val(bb1) And Val(aa1) <> 0 Then ';除数大于被除数时
ppp = "0."
z = z - 1
aa1 = aa1 + "0"
mv = 1
End If
If mv = 0 Then
GoTo 2
Else
1: If (Len(aa1) = Len(bb1) And aa1 < bb1) Or Len(Trim$(aa1)) < Len(Trim$(bb1)) Then ';被除数小于除数时
ppp = ppp + "0"
aa1 = aa1 + "0"
z = z - 1
GoTo 1
Else
GoSub sub3
If Val(sy$) * Val(aa1) = 0 Then Return ';余数或被除数为零停止计算
GoTo 3
End If
End If
2:
GoSub sub3
If Val(sy$) * Val(aa1) = 0 Then Return ';余数或被除数为零停止计算
ppp = ppp + "." ';以下计算小数部分
3: For iv = 1 To Z '; Z 是事先设定的小数位数
If Val(sy$) * Val(aa1) = 0 Then Return ';余数或被除数为零停止计算
aa1 = sy$ + "0"
GoSub sub3
4: Next iv
Return
sub3: ';大数相除
ccc = 0
vvv = 0 ';试余数不大于除数时的标志
If (Len(aa1) = Len(bb1) And aa1 = bb1) Then pp = "1": sy$ = "0": GoTo 50
If (Len(aa1) = Len(bb1) And aa1 < bb1) Or Len(Trim$(aa1)) < Len(Trim$(bb1)) Then ';被除数小于除数时
pp = "0"
sy$ = aa1
GoTo 50
End If
mv = 0 ';如果除数位数小于 3 位,则分子分母同放大 100 倍:
If Len(bb1) <= 2 Then aa1 = aa1 + "00": bb1 = bb1 + "00": mv = 1
fa = Len(aa1) ';把被除数的各位数码放在数组 a1(i)中
For i = 1 To fa ';a1(1)为最低位,a1(fa)为最高位
a1(i) = Mid(aa1, fa - i + 1, 1)
Next i
fb = Len(bb1) ';把除数的各位数码放在数组 b1(i)中
For i = 1 To fb ';b1(1)为最低位,b1(fb)为最高位
b1(i) = Mid(bb1, fb - i + 1, 1)
Next i
';以下取除数的近似数
e = b1(fb) * 1000 + (b1(fb - 1)) * 100 + b1(fb - 2) * 10 + b1(fb - 3) + 1
ta = fa: js = 0
For j = fa - fb + 1 To 1 Step -1 ';………… 做除法求商,求余数
js = js + 1
f = a1(ta) * 1000 + a1(ta - 1) * 100 + a1(ta - 2) * 10 + a1(ta - 3)
';取被除数的近似数
s1(js) = Int(f / e) ';…………………………………… 试商
For i = 1 To fb ';…………………………………… 求试商的积
c1(i) = b1(i) * s1(js) ';…… 近似商与除数相乘后的各位数字
Next i
d(0) = 0
For i = 1 To fb - 1 ';…………………………………… 满 10 进位
d(1) = Int((c1(i) + d(0)) / 10): c1(i) = c1(i) + d(0) - d(1) * 10
d(0) = d(1)
Next i
c1(fb) = c1(fb) + d(0)
qq$ = ""
For i = fb To 1 Step -1 ';……………… 求试商的精确积
qq$ = qq$ & c1(i) ';…… 试商与除数相乘后的精确积
Next i
For i = fb To 1 Step -1
a1(ta - fb + i) = a1(ta - fb + i) - c1(i)
Next i
For i = 1 To fb
If a1(ta - fb + i) < 0 Then
a1(ta - fb + i) = a1(ta - fb + i) + 10
a1(ta - fb + i + 1) = a1(ta - fb + i + 1) - 1
End If
Next i
a1(ta - 1) = a1(ta - 1) + a1(ta) * 10
ta = ta - 1
Next j ';至此,已初步算出最后的试商
a1(fb - 1) = a1(fb - 1) Mod (10)
For i = fb To 1 Step -1
ayy(i) = a1(i) ';试余数的各位数码
Next
ssy$ = "" ';以下做出试余数的字符串 ssy$
For i = fb To 1 Step -1
ssy$ = ssy$ & ayy(i)
11: Next i
If (Len(ssy$) = Len(bb1) And ssy$ > bb1) Or Len(Trim$(ssy$)) > Len(Trim$(bb1)) Then
vvv = 1 ';试余数大于除数时的标志
For i = 1 To fb ';试余数减去除数,得到正确余数 sy$
ay(i) = ayy(i) - b1(i)
If ay(i) < 0 Then
ay(i) = ay(i) + 10
ayy(i + 1) = ayy(i + 1) - 1
End If
Next i
sy$ = "" ';把 ay(i) 组装成 sy$
For i = 1 To fb
sy$ = Trim$(Str$(ay(i))) & sy$
Next i
71: If Mid$(sy$, 1, 1) = " " Or Mid$(sy$, 1, 1) = "0" Then sy$ = Mid$(sy$, 2) Else GoTo 72
GoTo 71 ';去掉结果中的多余 0
End If
72:
For i = 1 To fb - 1
c1(1) = a1(i) - b1(i)
ay(i) = c1(1) ';最后一次试商要修正时,这就是余数各位数(除最高位)
If c1(1) < 0 Then
ccc = -1
c1(1) = c1(1) + 10: a1(i + 1) = a1(i + 1) - 1
End If
Next i
c1(1) = a1(fb) - b1(fb)
ay(fb) = c1(1) ';最后一次试商要修正时,这就是余数的最高位
If c1(1) >= 0 Then '; c(1) 不是负数时最后一次试商要修正
s1(js) = s1(js) + 1 '; 所谓修正就是加一
End If
For i = js To 1 Step -1
If s1(i) >= 10 Then ';由于修正,商的某一位有大于10者,要调整进位
s1(i) = s1(i) - 10: s1(i - 1) = s1(i - 1) + 1
End If
Next i
If js = 1 Then ';以下做出商的字符串 pp
pp = s1(js)
End If
If js >= 2 Then
pp = 10 * s1(1) + s1(2)
End If
For i = 3 To js
pp = pp & s1(i)
Next i
If vvv = 1 Then GoTo 50 ';试余数大于除数
10: sy$ = "" ';以下做出余数的字符串 sy$
If ccc = -1 Then ';最后一次试商不必修正时的余数
For i = fb To 1 Step -1
If ayy(i) <> 0 Then yyy = 1
If ayy(i) = 0 And yyy = 0 Then GoTo 20
sy$ = sy$ & ayy(i)
20: Next i
End If
If ccc = 0 Then ';最后一次试商须修正时的余数
For i = fb To 1 Step -1
If ay(i) <> 0 Then yyy = 1
If ay(i) = 0 And yyy = 0 Then GoTo 30
sy$ = sy$ & ay(i)
30: Next
End If
If Mid(sy$, 1, 1) = "-" Then ccc = -1: GoTo 10 ';余数为负,重做余数
40: If Mid(sy$, 1, 1) = "0" Then sy$ = Mid(sy$, 2) ';去掉余数前面的多余零
If Mid(sy$, 1, 1) = "0" Then GoTo 40
50: If sy$ = "" Then sy$ = "0"
If mv = 1 And sy$ <> "0" Then sy$ = Mid(sy$, 1, Len(sy$) - 2)
If mv = 1 And sy$ = "0" Then sy$ = "0"
ppp = ppp + pp ';包括整数及小数的商
90: Return
End Sub
[br][br][color=#990000]-=-=-=-=- 以下内容由 天山草 在 时添加 -=-=-=-=-
计算示例:
aa1 = "1230": bb1 = "123" ';10
aa1 = "1230": bb1 = "1230" ';1
aa1 = "12300": bb1 = "123" ';100
aa1 = "1": bb1 = "6338327" ';0.000000157770339081590457545027260348038212607206917535179
aa1 = "87988067368960": bb1 = "17592186044416" ';5.001542568206787109375
aa1 = "879500001": bb1 = "7036" ';125000.00014212620807276861853325753268902785673678226264
aa1 = "1": bb1 = "10" ';0.1
aa1 = "1": bb1 = "1000" ';0.001
aa1 = "419585739361302": bb1 = "17592186044416" ';23.8506879305363099774695001542568206787109375
aa1 = "10000": bb1 = "100" ';100
aa1 = "27137146880": bb1 = "17592186044416" ';0.001542568206787109375
aa1 = "4195857393613021": bb1 = "123" ';34112661736691.22764227642276422764227642276422764227642276422764
aa1 = "10001": bb1 = "11" ';909.18181818181818181818181818181818181818181818181818
aa1 = "10001": bb1 = "1" ';10001
aa1 = "0": bb1 = "12345" ';0
aa1 = "100001": bb1 = "10" ';10000.1
aa1 = "5192025329987041388590727811603754": bb1 = "20282409603651670423947251286016"
';商 = 255.98661260899999999999999999999995804365651668974965
aa1 = "271528547786239939768517616341": bb1 = "20282409603651670423947251286016"
';商 = 0.0133873909999999999999999999999926525369069970125082
aa1 = "4344456764579839036296281861471": bb1 = "324518553658426726783156020576256"
';商 = 0.0133873910000000000000000000000388748555722906729815
|
|