RosettaCodeData/Task/Smith-numbers/FreeBASIC/smith-numbers.basic

56 lines
1.3 KiB
Plaintext

' FB 1.05.0 Win64
Sub getPrimeFactors(factors() As UInteger, n As UInteger)
If n < 2 Then Return
Dim factor As UInteger = 2
Do
If n Mod factor = 0 Then
Redim Preserve factors(0 To UBound(factors) + 1)
factors(UBound(factors)) = factor
n \= factor
If n = 1 Then Return
Else
' non-prime factors will always give a remainder > 0 as their own factors have already been removed
' so it's not worth checking that the next potential factor is prime
factor += 1
End If
Loop
End Sub
Function sumDigits(n As UInteger) As UInteger
If n < 10 Then Return n
Dim sum As UInteger = 0
While n > 0
sum += n Mod 10
n \= 10
Wend
Return sum
End Function
Function isSmith(n As UInteger) As Boolean
If n < 2 Then Return False
Dim factors() As UInteger
getPrimeFactors factors(), n
If UBound(factors) = 0 Then Return False '' n must be prime if there's only one factor
Dim primeSum As UInteger = 0
For i As UInteger = 0 To UBound(factors)
primeSum += sumDigits(factors(i))
Next
Return sumDigits(n) = primeSum
End Function
Print "The Smith numbers below 10000 are : "
Print
Dim count As UInteger = 0
For i As UInteger = 2 To 9999
If isSmith(i) Then
Print Using "#####"; i;
count += 1
End If
Next
Print : Print
Print count; " numbers found"
Print
Print "Press any key to quit"
Sleep