独舟星海
发表于 2021-10-17 14:14
编写一个程序求Q(奇数)减2的n次方其值没有素数的奇数
猜想每一个奇数(大于等于5的)都可以表示成一个素数+2^n形式,编写一个vb6程序,寻找一亿内的反例。例如1048573这个数,它小于2^20=1048576,也就是1048573-2^n这个式子中的n可以从1取到19,在这19次取值中,其结果假设没有素数,则次数是一个反例,其中有一次是素数,就不是反例,程序设计中,也可以考虑,当为真时,跳出循环,执行下一个奇数。最好先制作素数表,或许也不快,不如直接判断,比起判断一个数是否为素数要容易的多(是指运算时间上)。大概就这么个意思,有不清楚的地方,在商榷。
独舟星海
发表于 2021-10-17 14:20
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
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 & " 个。")
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
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
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
这是在vb6中,风吹过b给编写的代码,解决奇数=一个素数+2^n的反例问题。
ysr先生有空时,试运行一下,看一看结果,及运行速度。
ysr
发表于 2021-10-17 15:19
今天有空给你试试,明天去住院,去钢板,固定骨折的钢板。
ysr
发表于 2021-10-17 15:40
Private Sub 日志(cs As String)
With List1‘(试验显示list1变量未定义,无法运行,再学习一下)
If .ListCount >= 100 Then
.RemoveItem 0
End If
.AddItem Now & " " & cs
DoEvents
End With
End Sub
ysr
发表于 2021-10-17 16:13
独舟星海 发表于 2021-10-17 06:20
Option Explicit
Dim Ssb() As Long '素数表,1亿以内素数表,一共5761455个
Dim ssbj As Long
...
试验了几次,无法运行,经过修改也不行,我也不精通编程语言,还需要学习。
ysr
发表于 2021-10-17 16:18
Private Sub 生成素数表()
'如果已经有素数表,则不再生成
If ssbj > 3 Then Exit Sub
Dim i As Long, j As Long, t As Long
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)
Dim s$, i%, j, ja
Dim list1
s = Mid(ja, 2) '修改的部分
j = Split(s)
For i = 0 To UBound(j)
list1.AddItem j(i)
Next
With list1
If .ListCount >= 100 Then
.RemoveItem 0
End If
.AddItem Now & " " & cs
DoEvents
End With
End Sub
ysr
发表于 2021-10-17 16:49
本帖最后由 ysr 于 2021-10-17 09:30 编辑
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
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)
Dim s$, i%, j, ja
Dim list1
s = Mid(ja, 2) '修改的部分
j = Split(s)
For i = 0 To UBound(j)
list1.AddItem j(i)
cs = " " & j(i)
Next
End Sub
改成这样后结果是:Text1=26.(可能是不对,这样程序可以运行了,当输出改为Text1=i时,Text1=10001)
ysr
发表于 2021-10-17 20:40
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个符合条件的素数。
ysr
发表于 2021-10-17 20:48
本帖最后由 ysr 于 2021-10-17 13:09 编辑
发一下运行结果的图片:
ysr
发表于 2021-10-17 21:12
超过传送容量了!分成两个图片来传,再传一个:
页:
1
2
3
[4]
5
6
7
8
9
10
11
12
13