Integer Square/Cubic Root finder
Publié : mer. 16/juin/2010 0:55
Bonjour à tous,
J'ai eu besoin d'une fonction pour trouver la racine carré entière d'un entier et en faisant une recherche, je suis tombé sur un pseudo code qui ne fonctionnait pas mais l'idée de son fonctionnement était très intéressante. Il est certain que j'aurais pu faire un truc du genre :
mais je voulais une solution fonctionnant uniquement avec des entiers. La recherche de la racine s'effectue de façon dichotomique et c'est relativement rapide pour trouver la réponse. La fonction retourne -1 si l'entier n'a pas de racine carré entière.
P.S. J'ai ajouté la racine cubique par la suite juste pour m'amuser un peu. Le fonctionnement est le même
A+
Guimauve
J'ai eu besoin d'une fonction pour trouver la racine carré entière d'un entier et en faisant une recherche, je suis tombé sur un pseudo code qui ne fonctionnait pas mais l'idée de son fonctionnement était très intéressante. Il est certain que j'aurais pu faire un truc du genre :
Code : Tout sélectionner
Int(Sqr(Mon_entier))
P.S. J'ai ajouté la racine cubique par la suite juste pour m'amuser un peu. Le fonctionnement est le même
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Integer Square/Cubic Root
; Nom du fichier : IntegerSquareCubicRoot.pb
; Version du fichier : 1.0.0
; Programmation : OK
; Programmé par : : Guimauve
; Date : 14-06-2010
; Mise à jour : 14-06-2010
; Code PureBasic : 4.50
; Plateforme : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure.q IntegerSquareRoot(Value.q)
A.q = 0
B.q = 6074000999
Root.q = -1
While A <= B
D.q = (A + B) >> 1
D1.q = D * D
If Value > D1
A = D + 1
ElseIf Value < D1
B = D - 1
Else
Root = D
A = B + 1
EndIf
Wend
ProcedureReturn Root
EndProcedure
Procedure.q IntegerCubicRoot(Value.q)
A.q = 0
B.q = 4194303
Root.q = -1
While A <= B
D.q = (A + B) >> 1
D1.q = D * D * D
If Value > D1
A = D + 1
ElseIf Value < D1
B = D - 1
Else
Root = D
A = B + 1
EndIf
Wend
ProcedureReturn Root
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! ATTENTION - CODE D'ESSAI !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
For Index = 0 To 1500
Result01.l = IntegerSquareRoot(Index)
If Result01 = -1
;Debug Str(Index) + " n'a pas de racine carrée entière."
Else
Debug Str(Index) + " a une de racine carrée entière. --> " + Str(Result01) + "X" + Str(Result01) + " = " + Str(Index)
EndIf
Result02.l = IntegerCubicRoot(Index)
If Result02 = -1
; Debug Str(Index) + " n'a pas de racine cubique entière."
Else
Debug Str(Index) + " a une de racine cubique entière. --> " + Str(Result02) + "X" + Str(Result02) + "X" + Str(Result02) + " = " + Str(Index)
EndIf
; Debug ""
Next
; <<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< FIN DU FICHIER <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<
Guimauve