3

我正在尝试找到数字 x 的最大素数除数。当 x 小于 10 亿时,我的代码可以工作,但是当它大于 10 亿时,它会给出溢出错误,并且调试会突出显示其中包含 Mod 的行。

 Sub Largest_Divisor()
    Dim x As Double
    Dim Q As Integer
    Q = 0
    Dim L() As Double
    x = 999999999#
    Dim i As Double
    For i = 775145 To 3 Step -2
        If x Mod i = 0 Then
            If IsPrime(i) Then
                ReDim Preserve L(Q) As Double
                L(Q) = i
                Q = Q + 1
            End If
        End If
    Next i
    MsgBox (Application.Max(L))
 End Sub
4

2 回答 2

5

我怀疑当x大于大约 20 亿时,2,147,483,648确切地说,你遇到了麻烦。

这是因为根据 的文档mod,最多long返回 a ,其值范围从-2,147,483,6482,147,483,647为 32 位有符号值。帮助文档中没有明确说明,但 的参数mod也可能被强制使用long

于 2012-11-01T02:26:30.610 回答
2

一个好的解决方法是使用此功能:

Function Modulus(int1 As Double, int2 As Double) As Double

' This function will return int1 Mod int2. It is useful when |int1| exceeds 
' 2,147,483,647 as the VBA Mod function will then break.
'

Dim myInt As Integer

myInt = Int(int1 / int2)

Modulus = int1 - (myInt * int2)

End Function
于 2019-02-15T21:22:19.477 回答