I'm working on modernizing Rosetta Code's infrastructure. Starting with communications. Please accept this time-limited open invite to RC's Slack.. --Michael Mol (talk) 20:59, 30 May 2020 (UTC)

# User:Eriksiers/Prime numbers

This is something I first wrote several years ago (2002, according the the copyright... I don't remember). It is VBA/Excel (Visual Basic for Applications, Excel-specific) code that calculates the factors of a series of numbers, highlighting prime numbers by turning on the cell's `font.bold` property. I used Excel because it's especially suited for the tabular nature of the output.

I've placed it here, in its own page, because I feel that it doesn't specifically fit any of the (current) prime number-related tasks (although part of it does demonstrate Primality by Trial Division and Prime decomposition). This could perhaps be listed on the Category:Prime Numbers page, but I'll leave that decision to someone else.

This could be improved by using run-length encoding, assuming your implementation of RLE can handle multiple-character strings. (`2*2*2*11*11` -> `2^3*11^2`)

(Note the `Swap` subroutine. It's included here because VB doesn't provide such a function itself.)

`' Copyright 2002-2009 Erik Siers' source available under terms of the GNU GPL, version 2 or' (at your option) any later versionSub Swap(ByRef x, ByRef y)    Dim z    z = x    x = y    y = zEnd Sub Sub findPrimes()    ' determines prime numbers within a user-entered range    Dim prime As Boolean, neg As Boolean    Dim thisRow As Long, thisNumber As Long, startCol As Long, startRow As Long    Dim m As String, n As String, outP As String    Dim i As Long, j As Long     prime = True    ' true until proven false    startCol = ActiveCell.Column    startRow = ActiveCell.Row    thisRow = startRow - 1    m = InputBox("Starting number?", "Enter a whole number")    startVal = Int(Val(m))    n = InputBox("Ending number?", "Enter a whole number")    endVal = Int(Val(n))    If endVal < startVal Then Swap startVal, endVal    For i = startVal To endVal        thisRow = thisRow + 1        outP = ""        Select Case i            Case Is < 0                neg = True                thisNumber = -i            Case Is < 2                outP = Trim\$(Str\$(i))                neg = False                prime = False                GoTo badNum            Case Else                neg = False                thisNumber = i        End Selectloca:        For j = 2 To Int(thisNumber ^ 0.5)            If thisNumber Mod j = 0 Then                outP = outP & "*" & Trim\$(Str\$(j))                thisNumber = thisNumber / j                prime = False                GoTo loca            End If        Next        outP = outP & "*" & Trim\$(Str\$(thisNumber))        If outP = "" Then            outP = Trim\$(Str\$(i))        Else            outP = Mid\$(outP, 2)        End If        prime = (Val(outP) = i)badNum:        Cells(thisRow, startCol).Formula = Trim(Str(i))        If neg Then outP = "-1*" & outP        Cells(thisRow, startCol + 1).Formula = outP        If prime And Not (neg) Then            Cells(thisRow, startCol + 1).Font.Bold = True        Else            Cells(thisRow, startCol + 1).Font.Bold = False        End If        DoEvents    NextEnd Sub`