首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >看看这个数字是质数还是用excel公式表示质数因子?

看看这个数字是质数还是用excel公式表示质数因子?
EN

Stack Overflow用户
提问于 2017-03-29 07:36:02
回答 4查看 4.1K关注 0票数 2

我在A列中有整数,在B列中,我想显示结果'Prime‘,如果它没有关于数字本身的更多因子。这是这样的,例如,如果数字是37,结果将是'Prime‘,如果数字是44,则结果将是2x2x11。如何使用excel公式完成此操作?屏幕截图:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-29 10:50:34

免责声明:下面的代码是从此very useful VB.NET example移植过来的

Option Explicit

Sub Test()
    Debug.Print FindFactors(2)
    Debug.Print FindFactors(3)
    Debug.Print FindFactors(11)
    Debug.Print FindFactors(12)
    Debug.Print FindFactors(13)
    Debug.Print FindFactors(16)
    Debug.Print FindFactors(17)
    Debug.Print FindFactors(24)
    Debug.Print FindFactors(25)
    Debug.Print FindFactors(11234)
    Debug.Print FindFactors(67894)
End Sub

Function FindFactors(lngNumber As Long) As String
    Dim collFactors As Collection
    Dim lngFactor As Long
    Dim lngCounter As Long
    Dim strFactors As String
    Dim strFactor As String

    Set collFactors = New Collection

    ' Take out the 2s.
    Do While (lngNumber Mod 2 = 0)
        collFactors.Add 2
        lngNumber = lngNumber / 2
    Loop

    ' Take out other primes.
    lngFactor = 3
    Do While (lngFactor * lngFactor <= lngNumber)
        If (lngNumber Mod lngFactor = 0) Then
            ' This is a factor.
            collFactors.Add lngFactor
            lngNumber = lngNumber / lngFactor
        Else
            ' Go to the next odd number.
            lngFactor = lngFactor + 2
        End If
    Loop

    ' If num is not 1, then whatever is left is prime.
    If lngNumber > 1 Then
        collFactors.Add lngNumber
    End If

    ' make a string out of collection
    strFactors = ""
    If collFactors.Count = 1 Then
        strFactors = "Prime"
    Else
        For lngCounter = 1 To collFactors.Count
            strFactors = strFactors & collFactors(lngCounter)
            If lngCounter < collFactors.Count Then
                strFactors = strFactors & "x"
            End If
        Next lngCounter

    End If

    FindFactors = strFactors

End Function

输出结果为:

Prime
Prime
Prime
2x2x3
Prime
2x2x2x2
Prime
2x2x2x3
5x5
2x41x137
2x83x409

可以在工作表中使用:

票数 4
EN

Stack Overflow用户

发布于 2017-03-29 07:44:32

下面是一个比较简单的递归版本。它的思想是,一旦你确定了一个因子,你就用这个因子除以这个数字,然后把注意力转移到分解剩下的因子上。

Function Factor(ByVal n As Long, Optional FirstTrial As Long = 2) As String
    Dim i As Long
    Dim t As Long
    Dim limit As Long
    Dim rest As String
    Dim s As String

    If n = 1 Then
        Factor = n
        Exit Function
    End If
    limit = Int(Sqr(n))
    t = FirstTrial
    Do While t <= limit
        If n Mod t = 0 Then
            rest = Factor(n / t, t)
            If rest <> "1" Then
                s = t & "x" & rest
            End If
            Factor = s
            Exit Function
        Else
            If t = 2 Then t = 3 Else t = t + 2
        End If
    Loop
    'if we get here:
    Factor = n
End Function

Function PrimeOrFactor(n As Long) As String
    Dim s As String
    s = Factor(n)
    If n = 1 Then
        PrimeOrFactor = "Neither"
    ElseIf (s) = Trim(n) Then
        PrimeOrFactor = "Prime"
    Else
        PrimeOrFactor = s
    End If
End Function

测试结果如下:

Sub test()
    Dim i As Long
    For i = 1 To 20
        Cells(i, 1) = i
        Cells(i, 2) = PrimeOrFactor(i)
    Next i
End Sub

输出:

票数 2
EN

Stack Overflow用户

发布于 2019-06-05 08:31:51

对上面John Coleman的优秀代码稍作修改,使用下面包含的Mod with Doubles,将允许将整数分解到Excel的15位限制。因子较大的数字可能会明显变慢。例如,在核心i3上,562,951,983,465,953在大约5秒内被正确分解为16,777,259 x 33,554,467。

Function Factor(ByVal n As Double, Optional FirstTrial As Double = 2) As String 'Changed
    Dim i As Long
    Dim t As Double 'Changed
    Dim limit As Long
    Dim rest As String
    Dim s As String

    If n = 1 Then
        Factor = n
        Exit Function
    End If
    limit = Int(Sqr(n))
    t = FirstTrial
    Do While t <= limit
        If FMod(t, n) = 0 Then 'Changed
    .
    .
    .
    Public Function FMod(a As Double, b As Double) As Double
        FMod = a - Fix(a / b) * b

        'http://en.wikipedia.org/wiki/Machine_epsilon
        'Unfortunately, this function can only be accurate when `a / b` is outside [-2.22E-16,+2.22E-16]
        'Without this correction, FMod(.66, .06) = 5.55111512312578E-17 when it should be 0
        If FMod >= -2 ^ -52 And FMod <= 2 ^ -52 Then '+/- 2.22E-16
            FMod = 0
        End If
    End Function
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43081741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档