那为给解答一下?

解决方案 »

  1.   

    添加一个窗体,三个textbox控件、两个LABEL控件和一个commandbutton控件然后添加如下代码:Private Sub Command1_Click()
       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
      

  2.   

    '筛法:
    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
      

  3.   

    ...........
        For x = Text2.Text To Text3.Text
          For i = 2 To x\2
             If (x Mod i) = 0 Then GoTo g_next
          Next
    .............
         这样算法效率更高!
      

  4.   

    效率最高的应该是:  For i = 2 To sqr(x)只需要判断到x能否被x的平方根整除就够了。
      

  5.   

    给你一个比较有趣的算法——枪毙算法。
    原理是这样的:
    有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
      

  6.   

    呵呵,下面我发一个最有效率的算法:::::
            '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
      

  7.   

    shenyuflying请注意你的结果,速度是快了,但差不多有一半的非素数在里面哦!我们编程首先是要能得出正确的结果,在正确结果的前提下提高算法效率才是正确的!!!!!
      

  8.   

    只判断素数因数即可:Sub findprimes()
    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
      

  9.   

    时间效率较高的解法之一:Option ExplicitPrivate Sub Form_Load()
        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
      

  10.   

    Option Explicit
    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(秀峰) 方法比传统的方法还是很有优势的