那为给解答一下?
解决方案 »
- VB6程序在Win8下MouseMove事件异常的问题
- 请大家帮我看下这段代码,运行时提示没有for,请指点
- 用MCI打开光驱问题??
- VB做的ocx控件与.exe的区别有那些?用VB做ocx控件有那些弊病?
- 如何才能知道系统文件夹在哪个盘符下和系统文件夹叫什么名字?
- 在DataGrid中如果选中某一行就触发一个事件,应该用什么事件,要用到什么属性!是否能给出示范代码,谢谢!
- 急!在线等!怎么把邮件附件分离出来?
- 请问如何用程序压缩数据库?
- 求助个sql语句问题,问了很多人都无法回答
- 请教各位大哥,小弟最近遇到麻烦,为什么我的程序安装时,出现expsrv.dll无法注册的提示?expsrv.dll有什么作用?怎样闭掉?
- 如何将2007-6-5 8:23:45 时间格式转换为 二零零七年六月五日 八点二十三分四十五秒
- 人民币大写转换的问题,请高手解决,谢谢!
If Not IsNumeric(Text2.Text) Or Not IsNumeric(Text2.Text) Then MsgBox "请输入正确的起始与结束数!": Exit Sub
If CInt(Text2.Text) >= CInt(Text3.Text) Or Text2.Text < 1 Or Text3.Text < 1 Then MsgBox "您输入的数字不符合要求,请重新输入……": Exit Sub
Dim i As Integer, n As Integer, percent
n = 0
Text1.Text = ""
Text1.Text = Text2.Text & " 到 " & Text3.Text & " 之间的素数有:" & vbCrLf
For x = Text2.Text To Text3.Text
For i = 2 To x - 1
If (x Mod i) = 0 Then GoTo g_next
Next
If n <= 4 Then
Text1.Text = Text1.Text & x & Chr(9)
n = n + 1
Else
Text1.Text = Text1.Text & x & vbCrLf
n = 0
End If
Text1.SelStart = Len(Text1.Text)
Text1.Refresh
g_next:
Next
End Sub
Dim isPrime(1 To 1000) As Boolean
Dim i, j As Integer, s As Single'筛除所有偶数
For i = 3 To 1000 Step 2
isPrime(i) = True
Next iFor i = 3 To 1000 Step 2
If isPrime(i) Then
'素数验证
For j = 3 To i \ 2 Step 2
s = i
s = s / j
If s = i \ j And s > 1 Then
isPrime(i) = False
Exit For
End If
Next j
'筛除所有倍数
If isPrime(i) Then
For j = i * 3 To 1000 Step 2 * i
isPrime(j) = False
Next j
End If
End If
Next iFor i = 100 To 1000
If isPrime(i) Then Debug.Print i
Next i
For x = Text2.Text To Text3.Text
For i = 2 To x\2
If (x Mod i) = 0 Then GoTo g_next
Next
.............
这样算法效率更高!
原理是这样的:
有x个鬼子,你从第2号开始处理。如果你遇到第n号鬼子是活的,从n*2号开始逢n的倍数毙一个。如此循环一直枪毙到n=SQR(x)个,这个时候就没有可毙的了。接着开始收尸,遇到活的鬼子把它编号记下,这些号码就是x以内所有素数。
这个算法优点是速度比较快,缺点则是需要大量的内存空间。你想求x以内的素数,则需要x个元素。该算法如果用链表改进的话,速度更快。Function KillNums(ByVal pBound As Integer) As Long()
Dim tOutNums() As Long '幸存素数
Dim tAllNums() As Boolean '刑场数组
ReDim tAllNums(pBound)
Dim tStepIndex As Long
Dim tNumIndex As Long
Dim tOutIndex As Long
Dim tOutLength As Long
'枪毙过程
For tNumIndex = 2 To Sqr(pBound)
If Not tAllNums(tNumIndex) Then '如果第tNumIndex个是活的
For tStepIndex = (tNumIndex * 2) To pBound Step tNumIndex
'从tNumIndex * 2开始,遇到tNumIndex的倍数枪毙一个。
tAllNums(tStepIndex) = True
Next
End If
Next
'收尸过程
For tNumIndex = 2 To pBound
If Not tAllNums(tNumIndex) Then '如果是活的记下号码。
ReDim Preserve tOutNums(tOutLength)
tOutNums(tOutLength) = tNumIndex
tOutLength = tOutLength + 1
End If
Next
KillNums = tOutNums()
End FunctionPrivate Sub Command1_Click()
Dim tLongs() As Long
tLongs() = KillNums(1000)
Dim tIndex As Long
For tIndex = 0 To UBound(tLongs())
Text1.Text = Text1.Text & tLongs(tIndex) & vbCrLf
Next
End Sub
'sheng cheng zhishu
Dim z(100) As Integer
z(1) = 2
z(2) = 3
z(3) = 5
z(4) = 7
Dim i As Integer = 5
Dim mun As Integer = 11
Do While i < 101
If mun Mod 2 > 0 And mun Mod 3 > 0 And mun Mod 5 > 0 And mun Mod 7 > 0 Then
z(i) = mun
i += 1
End If
mun += 1
Loop
Dim i As Long, j As Byte, n As Long, beprime As Boolean, s() As String, p
p = Array(3, 5, 7, 11, 13, 17, 19, 23, 29, 31)
For i = 101 To 1000 Step 2
beprime = True
For j = 0 To 9
If i Mod p(j) = 0 Then beprime = False: Exit For
If p(j) > Sqr(i) Then Exit For
Next
If beprime = True Then
n = n + 1
ReDim Preserve s(1 To n)
s(n) = i
End If
Next
MsgBox Join(s, ","), , "100-1000中有 " & n & " 个素数"
End Sub
Const Min = 100
Const Max = 1000
Dim A(2 To Max) As Boolean
Dim i As Integer, j As Integer
For i = 2 To Max
If Not A(i) Then
For j = 2 To Max \ i
A(i * j) = True
Next j
End If
Next i
For i = Min To Max
If Not A(i) Then Debug.Print i;
Next i
End
End Sub
Private Declare Function GetTickCount Lib "kernel32.dll" () As LongPrivate Sub Command1_Click()
Const Min = 100
Const Max = 1000
Dim i As Integer, j As Integer, k As Integer, t As Long
t = GetTickCount
For k = 1 To 1000
For i = Min To Max
For j = 2 To Sqr(i)
If (i Mod j) = 0 Then GoTo l1
Next j
'Debug.Print i;
l1:
Next i
Next k
MsgBox " Time:" & GetTickCount - t & vbCrLfEnd SubPrivate Sub Command2_Click()
Const Min = 100
Const Max = 1000
Dim A(2 To Max) As Boolean
Dim i As Integer, j As Integer, k As Integer, t As Long
t = GetTickCount
For k = 1 To 1000
For i = 2 To Max
If Not A(i) Then
For j = 2 To Max \ i
A(i * j) = True
Next j
End If
Next i
For i = Min To Max
'If Not A(i) Then Debug.Print i;
Next i
Next kMsgBox " Time:" & GetTickCount - t & vbCrLfEnd Subjadeluo(秀峰) 方法比传统的方法还是很有优势的