Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2356|回复: 4

[已解决]VBA计算孪生素数

[复制链接]
发表于 2016-4-20 16:49 | 显示全部楼层 |阅读模式


VBA计算孪生素数


求1000以内的孪生素数,孪生素数是指:若a为素数,且a+2也是素数,则素数a和a+2称为孪生素数





最佳答案
2016-4-20 16:58
  1. Sub tt()
  2.     Dim N&
  3.     For N = 3 To 997 Step 2
  4.         If ZS(N) And ZS(N + 2) Then p = p + 1: Cells(p, 1) = N & "," & N + 2        
  5.     Next
  6. End Sub

  7. Function ZS(nNum&) As Boolean  '判断是否质数
  8.     Dim N&, i&
  9.     ZS = True
  10.     If nNum <= 3 Then Exit Function
  11.     N = Int(Sqr(nNum))
  12.     For i = 2 To N
  13.         If nNum / i = nNum \ i Then ZS = False: Exit Function
  14.     Next
  15. End Function
复制代码
共35组
3,5
5,7
11,13
17,19
29,31
41,43
59,61
71,73
101,103
107,109
137,139
149,151
179,181
191,193
197,199
227,229
239,241
269,271
281,283
311,313
347,349
419,421
431,433
461,463
521,523
569,571
599,601
617,619
641,643
659,661
809,811
821,823
827,829
857,859
881,883
发表于 2016-4-20 16:58 | 显示全部楼层    本楼为最佳答案   
  1. Sub tt()
  2.     Dim N&
  3.     For N = 3 To 997 Step 2
  4.         If ZS(N) And ZS(N + 2) Then p = p + 1: Cells(p, 1) = N & "," & N + 2        
  5.     Next
  6. End Sub

  7. Function ZS(nNum&) As Boolean  '判断是否质数
  8.     Dim N&, i&
  9.     ZS = True
  10.     If nNum <= 3 Then Exit Function
  11.     N = Int(Sqr(nNum))
  12.     For i = 2 To N
  13.         If nNum / i = nNum \ i Then ZS = False: Exit Function
  14.     Next
  15. End Function
复制代码
共35组
3,5
5,7
11,13
17,19
29,31
41,43
59,61
71,73
101,103
107,109
137,139
149,151
179,181
191,193
197,199
227,229
239,241
269,271
281,283
311,313
347,349
419,421
431,433
461,463
521,523
569,571
599,601
617,619
641,643
659,661
809,811
821,823
827,829
857,859
881,883
回复

使用道具 举报

发表于 2016-4-23 13:08 | 显示全部楼层
这个没啥意思。

生成所有素数、检查第x个素数的相邻数是否为素数……这样做并没有技术含量。

评分

参与人数 1 +9 收起 理由
vbyou127 + 9 来学习

查看全部评分

回复

使用道具 举报

发表于 2016-4-23 13:45 | 显示全部楼层
本帖最后由 香川群子 于 2016-4-23 13:53 编辑

我的代码稍复杂,但速度效率那是最高的。
  1. Sub GetTwoPrime() '筛子算法快速计算范围内素数,并输出孪生素数
  2.     Dim a&(), b(), i&, j&, k&, m&, n&, s&

  3.     n = [a1] 'n=1000
  4.     m = n \ 2 '取整数的一半……即仅需检查奇数 忽略所有偶数
  5.     ReDim a&(m), b(m, 1)

  6.     For i = 1 To Sqr(n) \ 2 '开方得到最大除数范围
  7.         If a(i) = 0 Then '仅用已知素数作为除数
  8.             s = i * 2 + 1 '首个除数 i=1实际表示的奇数值s=1*2+1=3
  9.             For j = s + i To m Step s '以该奇数除数s为步长 滤除其倍数值
  10.                 a(j) = 1
  11.             Next
  12.         End If
  13.     Next

  14.     For i = 0 To m - 1 '检查所有奇数集合 (一次都未被筛出的=0的为素数) 中是否有孪生素数 即连续2个0
  15.         If a(i) = 0 Then If a(i + 1) = 0 Then b(k, 0) = i * 2 + 1: b(k, 1) = b(k, 0) + 2: k = k + 1 Else i = i + 1
  16.     Next
  17.     [a2].Resize(k, 2) = b '输出到工作表
  18. End Sub
复制代码

评分

参与人数 1 +9 收起 理由
vbyou127 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-4-23 16:38 | 显示全部楼层
香川群子 发表于 2016-4-23 13:45
我的代码稍复杂,但速度效率那是最高的。

我猜,你在给 grf13  示威

香川群子      grf13   正准备参加华山论剑,     

你俩谁高谁低,我只当观众   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-27 11:08 , Processed in 0.449982 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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