-1

我最近学会了使用数组作为我的 VBA 宏的一部分。我知道它们是有效使用 VBA 不可或缺的一部分,因此我想了解更多有关如何有效处理数组的信息。我搜索了一下,找到了几篇文章,但如果我缺少一些主要的东西,请告诉我。

这是一个示例代码,一个查找第 N 个素数的子程序。它通过在素数数组上使用试除法来实现这一点,动态地将新素数添加到数组中。

Sub FindNthPrime()
    StartTime = Timer
    Dim Counter, n, i As Single
    Dim Primes() As Double  'An array of primes so far
    Dim TestVal As Double
    Dim PrimeTest As Boolean
    
    n = 100000  'Find the n'th prime number
    
    ReDim Primes(0)
    Primes(0) = 2  'Start the array at 2
    Counter = 1    'Start the Counter at 1
    TestVal = 3    'Start testing with 3
    
    Do Until Counter = n
        PrimeTest = True
        For i = 0 To UBound(Primes)
            If Primes(i) > (TestVal ^ 0.5) Then Exit For
            If TestVal Mod Primes(i) = 0 Then
                PrimeTest = False
                Exit For
            End If
        Next i
        
        If PrimeTest = True Then
            ReDim Preserve Primes(UBound(Primes) + 1)
            Primes(UBound(Primes)) = TestVal
            Counter = UBound(Primes) + 1
        End If
        
        TestVal = TestVal + 2
    Loop
    
    Debug.Print Primes(UBound(Primes))
    Debug.Print Timer - StartTime
End Sub

在基本的基准测试中,此代码在不使用数组(测试所有奇数直到我们测试数的平方根)的情况下确实优于蛮力试除算法,但相差不大。随着质数变大,在本例中是 100,000 的质数,我们看到我的机器上的计算时间超过了 5 秒。

TL;DR:关于使上述代码更高效的任何提示?

4

1 回答 1

1

Dim Counter, n, i As Single
默认类型是variant如此计数器并且nvariants
Redim Preserve一个昂贵的选项,因此从一个大数组大小开始并以Redim Preserve大数字递增。尽可能
使用而不是or 但大部分时间可能会被and占用Longsingledouble
Mod^

于 2013-10-08T11:25:23.013 回答