je crois etre arrivé a un resultat possible !
le probleme c'est la taille du précalcul ! 4Go c'est trop pour mon ordinateur !
principe
je precalcul tout les chiffres de 1 a 800 ( on peut mettre plus... mais 4Go c'est trop pour mon ordinateur ! )
c'est a dire que je convertie tout les chiffres en base 9 ....
et je pose le resultat dans une liste chainée .... et c'est la que ce pose la limite de Ram avec les 4Go... faudrai peut etre ecrire le precalcul dans un fichier a la place ...
une valeur qu'on donne pour le test est "encodé" en base 9
on affiche la conversion avec un debug ...
puis on va lire la liste chainée pour afficher le chiffre correspondant avant la conversion !
et c'est la qu'il faudrait faire un acces Disque pour lire un fichier au lieu d'une liste chainée trop petite...
ça reprends un peu le principe énoncé par G-rom avec son utilisation des Map ...
seulement meme les Map se casseront le nez sur les 4Go ....
je remarque qu passage que tu nous ajoutes des difficultés au fur et a mesure .... le coup des 4 go ...
voici mon code :
Code : Tout sélectionner
; l'algo est basé sur le principe suivant :
; pour le nombre 94 en base 2
; 94/2 = 0 reste 47
; 47/2 = 1 reste 23
; 23/2 = 1 reste 11
; 11/2 = 1 reste 5
; 5/2 = 1 reste 2
; 2/2 = 0 reste 1
; donc : nombre/base .... on recup le resultat qu'on affiche, puis on prends le reste de la division comme nouveau nombre !
; ce qui donne "1011110" (en partant du dernier puis en remontant )
Declare.s Base(nombre,Base)
Declare Precalcul(Max)
global newlist list.i()
Precalcul(10000) ; ici precalcul jusqu'a 100000 car avec 4go ça fait trop et ça plante
; ****** un exemple ************
nombre=800 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ICI TU peux METTRE LE CHIFFRE QUE TU VEUX POUR TESTER
base=9 ; en Octal ; PAS TOUCHER
resultat.s=Base(nombre,Base)
Debug "la valeur "+str(nombre)+" en base 9 ="+resultat.s
; inverse
ResetList(List())
SelectElement(List(), nombre)
Debug "la valeur "+resultat.s+" en base inverse ="+str(List())
calldebugger
Procedure.s Base(nombre,Base)
; By Dobro
string_ref.s="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
while nombre>0
reste=Mod(nombre,base)
Resultat.s=Resultat.s+ StringField(string_ref.s,Reste+1,",") ;;str(reste)
nombre=nombre/base
Wend
ProcedureReturn ReverseString(Resultat.s)
Endprocedure
procedure Precalcul(Max)
; By Dobro
; on precalcul les résultats pour toute la
For i=0 to Max
base=10 ; en Octal
resultat.s=Base(i,Base)
AddElement (list())
list()=val(resultat.s)
Next i
Endprocedure
; EPB