标题:编写一个程序求Q(奇数)减2的n次方其值没有素数的奇数
只看楼主
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 10楼 风吹过b
好的,我加了控件,试验了一下,可以运行了:

Option Explicit
Dim Ssb() As Long            '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
Dim b2b(30) As Long         '2的倍数表,long 范围最大只能容纳 2^31,但最后一个数用不了,会超范围

Const 范围 As Long = 10000  '1亿以内,我光生成素数表就用了超过4分钟。你要测试1亿,直接把这1万改成1亿吧

Private Sub Command1_Click()
Dim i As Long, j As Long, o As Long, t As Long, ja
Dim fly As Boolean, flj As Long, fl() As Long

flj = 0
ReDim fl(flj)

Call 日志("开始生成素数表")
Call 生成素数表

Call 日志("开始生成2的倍数表")
Call 生成倍数表

Call 日志("开始计算....")

For i = 5 To 范围 Step 2
    j = 1
    fly = False             '假设不符合
    Do While i > Ssb(j)
        t = i - Ssb(j)
        For o = 0 To 30         '这里会浪费循环次数,不管了
            If t = b2b(o) Then
                fly = True      '找到符合
                Exit For        '不再查找
            End If
        Next o
        If fly Then Exit Do     '找到符合不再查找
        j = j + 1
    Loop
    If Not fly Then             '如果都没找到
        flj = flj + 1           '保存结果
        ReDim Preserve fl(flj)
        fl(flj) = i
        Call 日志("找到第 " & flj & " 个: " & i)        '显示结果,注意 日志过程中有 DoEvents 命令,会拖慢运算速度
    End If
Next i

Call 日志("完成查找,共找到 " & flj & " 个。")
Text1 = flj
Combo1 = List1.ListCount
End Sub

Private Sub 生成倍数表()
'如果有倍数表,则不再生成
If b2b(30) > 0 Then Exit Sub

Dim i As Long
For i = 0 To 30
    b2b(i) = 2 ^ i
Next i
End Sub

Private Sub 生成素数表()
'如果已经有素数表,则不再生成
If ssbj > 3 Then Exit Sub

Dim i As Long, j As Long, t As Long, ja
Dim sy As Boolean

'素数从2开始,需要指定
ssbj = 1
ReDim Ssb(ssbj)
Ssb(1) = 2

For i = 3 To 范围 Step 2
    sy = True
    t = Sqr(i)
    For j = 3 To ssbj
        If t < Ssb(j) Then Exit For
        If i Mod Ssb(j) = 0 Then
            sy = False
            Exit For
        End If
    Next j
    If sy Then
        ssbj = ssbj + 1
        ReDim Preserve Ssb(ssbj)
        Ssb(ssbj) = i
         ja = " " & i '增加一条
    End If
Next i
End Sub

Private Sub 日志(cs As String)
    With List1
        If .ListCount >= 100 Then
            .RemoveItem 0
        End If
        .AddItem Now & " " & cs
        DoEvents
    End With
End Sub

'加了控件list1就可以运行了,结果是找到26个符合条件的素数。
2021-10-17 20:43
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
传一下程序运行结果的图片:
2021-10-17 21:14
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
咋不都是素数?有能被3或5整除的!
2021-10-17 21:19
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
以下是引用ysr2857在2021-10-17 21:19:05的发言:

咋不都是素数?有能被3或5整除的!

仔细看一下题,要求是  猜想每一个奇数(大于等于5的)都可以表示成一个素数+2^n形式,  找反例。
所以找到的都是奇数,不是素数 。你可以看下我 6楼上传的 excle 文档。
可以拿这个文档对结果进行验算。


授人于鱼,不如授人于渔
早已停用QQ了
2021-10-17 21:54
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 14楼 风吹过b
嗯嗯好的,明白了,那就对了!谢谢!
2021-10-17 22:05
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
经验证,一亿内有4457973个数不符合题主猜想,比如127就是楼主所说的反例。验证代码如下(编译后用时5秒即可得到一亿内的结果)
程序代码:
Dim pri(100000000) As Byte, gusnum(10) As Long

Sub getpri()
  '获取一亿内素数map,5秒内可完成
  Dim i As Long, j As Long
  pri(0) = 1
  pri(1) = 1
  For i = 4 To 100000000 Step 2
    pri(i) = 1
  Next
  For i = 3 To 10000 Step 2
    If pri(i) = 0 Then
      For j = i * i To 100000000 Step i * 2
        pri(j) = 1
      Next
    End If
  Next
End Sub

Private Sub Command1_Click()
  '验证猜想,统计不符合的总数,并把前10个数存到数组中供验证
  Dim i As Long, j As Long, k As Long, t As Double
  t = Timer()
  For i = 5 To 100000000 Step 2
    j = 2
    Do While j < i
      If pri(i - j) = 0 Then Exit Do
      j = j * 2
    Loop
    If j >= i Then
      If k <= 10 Then gusnum(k) = i
      k = k + 1
    End If
  Next
  MsgBox k & "个数无法表示为p+2^N的形式,用时" & Timer() - t & ""
End Sub

Private Sub Form_Load()
  getpri
  Command1_Click
End Sub

能编个毛线衣吗?
2021-10-18 02:51
独木星空
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 16楼 wmf2014
因为系统提示结贴,今天没有来的及浏览帖子,就急急忙忙结贴了,结贴后才看到先生的回帖,抱歉,没有给你送分。

素数问题的解决是我学习编程永恒的动力。
2021-10-18 07:19
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
素数,用筛法本来就是快,但我不会,没去看过相关算法,只是了解过而以。一般还有一个整理过程。
但在这个问题不需要整理,直接判断,比一个一个的去比较更快。

还是 wmf2014 的算法好。


授人于鱼,不如授人于渔
早已停用QQ了
2021-10-18 08:46
独木星空
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 16楼 wmf2014
人生的路,只能往前走,从来就没有回头的路。所以,没有二次选择,无论选对,还是选错,都无法改过。

素数问题的解决是我学习编程永恒的动力。
2021-10-19 17:06
独木星空
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 16楼 wmf2014
wmf2014先生的算法,在这个问题上应该是最好的。

素数问题的解决是我学习编程永恒的动力。
2021-11-06 12:46



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




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

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