77 lines
2 KiB
Text
77 lines
2 KiB
Text
'#include "isprime.bas"
|
|
|
|
Function FactorSum(n As Uinteger) As Uinteger
|
|
Dim As Uinteger result = 0
|
|
Dim As Uinteger v = Abs(n)
|
|
While v > 1 And v Mod 2 = 0
|
|
result += 2
|
|
v \= 2
|
|
Wend
|
|
For f As Uinteger = 3 To v Step 2
|
|
While v > 1 And v Mod f = 0
|
|
result += f
|
|
v \= f
|
|
Wend
|
|
Next f
|
|
Return result
|
|
End Function
|
|
|
|
Function DigitProduct(n As Uinteger, base_ As Uinteger) As Uinteger
|
|
If n = 0 Then Return 0
|
|
Dim As Uinteger result = 1
|
|
Dim As Uinteger v = Abs(n)
|
|
While v > 0
|
|
result *= v Mod base_
|
|
v \= base_
|
|
Wend
|
|
Return result
|
|
End Function
|
|
|
|
Function isRhonda(n As Uinteger, base_ As Uinteger) As Uinteger
|
|
Return base_ * FactorSum(n) = DigitProduct(n, base_)
|
|
End Function
|
|
|
|
Function ToBaseString(n As Uinteger, base_ As Uinteger) As String
|
|
If n = 0 Then Return "0"
|
|
Dim As Uinteger under10 = Asc("0")
|
|
Dim As Uinteger over9 = Asc("a") - 10
|
|
Dim As String result = ""
|
|
Dim As Uinteger v = Abs(n)
|
|
While v > 0
|
|
Dim As Uinteger d = v Mod base_
|
|
result = Chr(d + Iif(d < 10, under10, over9)) + result
|
|
v \= base_
|
|
Wend
|
|
Return result
|
|
End Function
|
|
|
|
Dim As Uinteger maxRhonda = 10, maxBase = 16
|
|
For base_ As Uinteger = 2 To maxBase
|
|
If Not isPrime(base_) Then
|
|
Print "The first "; maxRhonda; " Rhonda numbers in base "; base_; ":"
|
|
Dim As Uinteger rCount = 0
|
|
Dim As Uinteger rhonda(1 To maxRhonda)
|
|
Dim As Uinteger n = 1
|
|
While rCount < maxRhonda
|
|
If isRhonda(n, base_) Then
|
|
rCount += 1
|
|
rhonda(rCount) = n
|
|
End If
|
|
n += 1
|
|
Wend
|
|
Print " in base 10: ";
|
|
For i As Uinteger = 1 To maxRhonda
|
|
Print " "; rhonda(i);
|
|
Next i
|
|
Print
|
|
If base_ <> 10 Then
|
|
Print Using " in base ##: "; base_;
|
|
For i As Uinteger = 1 To maxRhonda
|
|
Print " "; ToBaseString(rhonda(i), base_);
|
|
Next i
|
|
Print
|
|
End If
|
|
End If
|
|
Next base_
|
|
|
|
Sleep
|