62 lines
1.3 KiB
Plaintext
62 lines
1.3 KiB
Plaintext
EnableExplicit
|
|
|
|
Procedure.i SumBinaryDigits(Number)
|
|
If Number < 0 : number = -number : EndIf; convert negative numbers to positive
|
|
Protected sum = 0
|
|
While Number > 0
|
|
sum + Number % 2
|
|
Number / 2
|
|
Wend
|
|
ProcedureReturn sum
|
|
EndProcedure
|
|
|
|
Procedure.i IsPrime(Number)
|
|
If Number <= 1
|
|
ProcedureReturn #False
|
|
ElseIf Number <= 3
|
|
ProcedureReturn #True
|
|
ElseIf Number % 2 = 0 Or Number % 3 = 0
|
|
ProcedureReturn #False
|
|
EndIf
|
|
Protected i = 5
|
|
While i * i <= Number
|
|
If Number % i = 0 Or Number % (i + 2) = 0
|
|
ProcedureReturn #False
|
|
EndIf
|
|
i + 6
|
|
Wend
|
|
ProcedureReturn #True
|
|
EndProcedure
|
|
|
|
Procedure.i IsPernicious(Number)
|
|
Protected popCount = SumBinaryDigits(Number)
|
|
ProcedureReturn Bool(IsPrime(popCount))
|
|
EndProcedure
|
|
|
|
Define n = 1, count = 0
|
|
If OpenConsole()
|
|
PrintN("The following are the first 25 pernicious numbers :")
|
|
PrintN("")
|
|
Repeat
|
|
If IsPernicious(n)
|
|
Print(RSet(Str(n), 3))
|
|
count + 1
|
|
EndIf
|
|
n + 1
|
|
Until count = 25
|
|
PrintN("")
|
|
PrintN("")
|
|
PrintN("The pernicious numbers between 888,888,877 and 888,888,888 inclusive are : ")
|
|
PrintN("")
|
|
For n = 888888877 To 888888888
|
|
If IsPernicious(n)
|
|
Print(RSet(Str(n), 10))
|
|
EndIf
|
|
Next
|
|
PrintN("")
|
|
PrintN("")
|
|
PrintN("Press any key to close the console")
|
|
Repeat: Delay(10) : Until Inkey() <> ""
|
|
CloseConsole()
|
|
EndIf
|