RosettaCodeData/Task/Pernicious-numbers/PureBasic/pernicious-numbers.basic

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