数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: moranhuishou

一款可瞬间判定素数的神奇小软件

[复制链接]
 楼主| 发表于 2008-9-12 14:11 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

先谢过了。
发表于 2008-9-13 09:09 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

先发一个“大数相加”的 VB 程序:
     '; 文件名:  大数相加
     '; 两个大整数相加
     Private Sub form_Click()
   
     Open "相加.txt" For Output As 1
     Dim a As String             ';作为字符串输入的 a
     Dim b As String             ';作为字符串输入的 b
     Dim c As String             ';作为字符串输出的和
     
     Dim aa(100000) As Long      ';存放被加数的各位数字
     Dim bb(100000) As Long      ';存放加数的各位数字
     Dim cc(100000) As Long      ';存放和的各位数字
     
     a = "123456789123456789"
     b = "987654321123456789"
     GoSub sub1
     a = "123456789123456789"
     b = "987654321987654321"
     GoSub sub1
     
     
     
     Exit Sub  ';主程序结束
     
sub1:
     La = Len(a)        ';把 a 字串(被加数)的各位数码放在数组 aa(i)中
     For i = 1 To La    ';aa(1)为最低位,aa(La)为最高位
       aa(i) = Mid(a, La - i + 1, 1)
     Next i
     
     Lb = Len(b)        ';把 b 字串(加数)的各位数码放在数组 bb(i)中
     For i = 1 To Lb    ';bb(1)为最低位,bb(La)为最高位
       bb(i) = Mid(b, Lb - i + 1, 1)
     Next i
     
     If La >= Lb Then LL = La Else LL = Lb
     For i = 1 To LL
       cc(i) = aa(i) + bb(i)
     Next i
     
     c = ""             ';处理进位
     For i = 1 To LL + 1
       If cc(i) >= 10 Then
          cc(i) = cc(i) - 10
          cc(i + 1) = cc(i + 1) + 1    ';此处可能产生 cc(LL + 1) = 1 的问题
       End If                          ';但不可能产生 cc(LL + 2) = 1 的问题
     c = Trim$(Str$(cc(i))) & c
     Next i
     
     cc(LL + 1) = 0:    ';cc(LL + 1) 清零,否则二次调用子程序时出错
     
     Print "c="; c
     Print #1, "c="; c
     Return
     
     End Sub
------------------------
上面程序运行结果:
c = 1111111110246913578
c = 1111111111111111110
     
   
     
   
   
   
发表于 2008-9-13 09:16 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

下面是“大数相减”程序:
     '; 文件名:  大数相减
     Private Sub form_Click()
   
     Open "相减结果.txt" For Output As 1
     Dim a5 As String             ';作为字符串输入的 a5
     Dim b5 As String             ';作为字符串输入的 b5
     Dim c5 As String             ';作为字符串输出的差
     Dim t5 As String
     
     Dim aa5(100000) As Long      ';存放被减数的各位数字
     Dim bb5(100000) As Long      ';存放减数的各位数字
     Dim cc5(100000) As Long      ';存放差的各位数字
     
     a5 = "45891798"
     b5 = "35698451212"
     GoSub sub5                   ';计算 a5 - b5
     a5 = "45891156482135798"
     b5 = "35698451212"
     GoSub sub5
     a5 = "45891156482135798"
     b5 = "45891156482135798"
     GoSub sub5
     Exit Sub  ';主程序结束
     
sub5:
      k = 0   ';先假定 a5 - b5 够减
     If (Len(a5) = Len(b5) And a5 < b5) Or Len(Trim&#36;(a5)) < Len(Trim&#36;(b5)) Then  ';a5 < b5
      t5 = b5: b5 = a5: a5 = t5  ';a5、b5 字串交换
      k = -1               ';不够减,做记号
     End If
     
     If (Len(a5) = Len(b5) And a5 = b5) Then c5 = "0": GoTo 888   ';a5 = b5
     La5 = Len(a5)        ';把 a5 字串(被减数)的各位数码放在数组 aa5(i)中
     For i5 = 1 To La5: aa5(i5) = Mid(a5, La5 - i5 + 1, 1): Next i5 ';aa5(1)最低位,aa5(La5)最高位
     Lb5 = Len(b5)        ';把 b5 字串(减数)的各位数码放在数组 bb5(i)中
     For i5 = 1 To Lb5: bb5(i5) = Mid(b5, Lb5 - i5 + 1, 1): Next i5 ';bb5(1)最低位,bb5(Lb5)最高位
     For i5 = 1 To La5: cc5(i5) = aa5(i5) - bb5(i5)
        If cc5(i5) < 0 Then cc5(i5) = cc5(i5) + 10: aa5(i5 + 1) = aa5(i5 + 1) - 1
     Next i5
     c5 = ""             ';把 cc5(i) 组装成 c5
     For i5 = 1 To La5: c5 = Trim&#36;(Str&#36;(cc5(i5))) & c5: Next i5
     For i5 = 1 To Len(c5) ';去掉多余 0
      If Mid&#36;(c5, 1, 1) <> 0 Then Exit For Else c5 = Mid&#36;(c5, 2)
     Next i5
     If k = -1 Then c5 = "-" + c5   ';不够减加上负号
                     
888: Print "c5="; c5
     Print &#35;1, "c5="; c5
     Return
     
     End Sub
---------------------------
运行结果:
c5 = -35652559414
c5 = 45891120783684586
c5 = 0
   
   
   
   
发表于 2008-9-13 09:41 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

[这个贴子最后由simpley在 2008/09/13 09:42am 第 1 次编辑]

一个数组元素只放一位数,效率太低!
乘法可以放四位数!
加减可以放更多!
发表于 2008-9-13 09:53 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

大数相乘:
     '; 文件名:  大数相乘
     '; 每个乘数位数不得超过 255 位,相乘结果不允许有误差
     Private Sub form_Click()
     Open "相乘结果.txt" For Output As 1
     
     Dim aa(2550), bb(2550), cc(6000)
     '; a * b = c
     a = "123456789123456789123456789123456789123456789123456789"
     b = "987654321987654321987654321987654321987654321987654321"
     GoSub sub1
     
     Close &#35;1
     Exit Sub
     
     
sub1:
     La = Len(a): Lb = Len(b)
     Lc = La + Lb
     For i = 1 To La
     q = 1 + La - i
     aa(i) = Val(Mid&#36;(a, q, 1))
     Next
     For i = 1 To Lb
     q = 1 + Lb - i
     bb(i) = Val(Mid&#36;(b, q, 1))
     Next
     For i = 1 To La
     For j = 1 To Lb
     p = i + j: q = p - 1
     n = aa(i) * bb(j)
     n0 = Int(n / 10)
     n1 = n - 10 * n0
     cc(q) = cc(q) + n1
     cc(p) = cc(p) + n0 + Int(cc(q) / 10)
     cc(q) = cc(q) - 10 * Int(cc(q) / 10)
     Next j, i
     c = ""
     If cc(Lc) = 0 Then
     Lc = Lc - 1
     End If
     For i = Lc To 1 Step -1
     c = c + Trim(Str(cc(i)))
     Next
     For i = 1 To Lc: cc(i) = 0: Next  ';若不清零,下次调用出错
     
     Print c          '; 此为乘积
     Print &#35;1, c
     Return
     End Sub
     
运行结果:
121932631356500531591068431825636332060204232294772132285474770050906869816338969581771069347203169112635269
发表于 2008-9-13 09:56 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

估计楼主不需要除法程序。先贴这些吧,程序未经优化,你先试用吧。
发表于 2008-9-13 10:46 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

天山草兄:
    给你发的邮件收到了吗?
 楼主| 发表于 2008-9-13 11:00 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

已阅,再次感谢,现在没空(医院看病人),,有时间认真消化.
发表于 2008-9-13 16:33 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

波浪先生:邮件收到了,已回复。
明天就是中秋佳节了,祝先生节日快乐,合家幸福!
发表于 2008-9-14 12:14 | 显示全部楼层

一款可瞬间判定素数的神奇小软件

下面引用由天山草2008/09/13 04:33pm 发表的内容:
波浪先生:邮件收到了,已回复。
明天就是中秋佳节了,祝先生节日快乐,合家幸福!
谢谢你的回复!祝你和各位网友中秋节心情愉快!
:em02:  :em03:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-6-17 03:53 , Processed in 0.088693 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表