Convertir un nombre base 10 vers 9 sans 0 et inverse
Salut, j'ai chercher pendent un moment et j'ai trouver de l'aide pour convertir
un nombre qui est en base 10 (0123456789) vers base 9 sans 0 (123456789)
(c'est pas vraiment ce terme mais bon...)
On m'as aidé et voici le code en question que j'ai convertie en PB.Net:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| Function Transformer(ByVal Int64 As Int64) As Int64
' À toutes les dizaines on est décalé d'une unité, ça donne une Retenue
Dim Retenue As Int64 = (Int64 - 1) \ 9
' On ajoute la Retenue au résultat
Dim Resultat As Int64 = Int64 + Retenue
' Pour l'instant on n'a modifié que les unités ajoutés toutes les dizaines, il faut aussi ajouter
' tous les blocs de 0 qui apparaissent 10 fois toutes les centaines, 100 fois tous les milliers, etc.
' Sans oublier qu'à chaque fois qu'on ajoute une Retenue celle-ci décale le résultat, il faut donc
' calculer aussi la Retenue de la Retenue !
' 1 = unités, 10 = dizaines, 100 = centaines...
Dim Rang As Int64 = 1
' On s'arrête quand il n'y a plus de Retenue à ajouter
While Retenue > 0
' Nouvelle Retenue à ajouter
Retenue = (10 * Rang) * ((Retenue - 1) \ (9 * Rang))
' Ajout de la Retenue
Resultat += Retenue
' Passage au Rang suivant
Rang *= 10
End While
Return Resultat
End Function
Sub Main()
Console.WriteLine(Transformer(1000))
Console.ReadLine()
End Sub |
Ce code est fonctionnel et très rapide, on peut surement l'améliorer mais c'est pas la priorité là :)
Bien, on m'as de même aider pour crée le code inverse en Purebasic qui fonctionne très bien mais convertie en VB.Net plus rien ne marche, serais t-il possible de corriger ou me dire se qui ne va pas svp :)
Ce code permet en théorie de convertir un nombre convertie sans 0 avec 0
Voici le code PureBasic:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| Procedure PowQ(nombre_q, puissance, resultat_q)
resultat_q = 1
For j = 1 To puissance
resultat_q * nombre_q
Next
ProcedureReturn resultat_q
EndProcedure
Procedure.q Decoder(Nombre.q)
Protected.q res, div10, mul9, c1, c2, reste, chiffre
Protected i.l, j.l
res = Nombre
nb_chiffre = IntQ(Log10(Nombre)) + 1
; div10 = Pow(10, nb_chiffre); ne fonctionne pas avec des Quad
div10 = PowQ(10, nb_chiffre, div10)
; mul9 = Pow(9, nb_chiffre - 1); ne fonctionne pas avec des Quad
mul9 = PowQ(9, nb_chiffre - 1, mul9)
For i = nb_chiffre - 1 To 1 Step -1
div10 / 10
c1 = Nombre / div10
chiffre = IntQ(c1) - IntQ(c1 / 10) * 10
mul9 / 9
res = res - i * mul9 * (chiffre + reste)
reste = reste * 10 + chiffre
Next
ProcedureReturn res
EndProcedure
Debug Str(DeCoder(27726677999)) |
Voici le code VB.Net:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| Function PowQ(ByVal NombreQ As Int64, ByVal Puissance As Int64, ByVal ResultaQ As Int64) As Int64
ResultaQ = 1
For j = 1 To Puissance
ResultaQ *= NombreQ
Next
Return ResultaQ
End Function
Function Décode(ByVal Nombre As Int64) As Int64
Dim Res As Int64 = Nombre
Dim Div10 As Int64 = 0
Dim Mul9 As Int64 = 0
Dim C1 As Int64 = 0
Dim Reste As Int64 = 0
Dim Chiffre As Int64 = 0
Dim NombreChiffre As Int64 = CLng(Fix(Math.Log10(Nombre))) + 1
Res = Nombre
Div10 = PowQ(10, NombreChiffre, Div10)
Mul9 = PowQ(9, NombreChiffre - 1, Mul9)
For i = NombreChiffre - 1 To 1 Step -1
Div10 \= 10
C1 = CLng(Nombre \ Div10)
Chiffre = CLng(Fix(C1) - Fix(CLng(C1) \ 10) * 10)
Mul9 \= 9
Res = CLng(Res - (i * Mul9 * (Chiffre + Reste)))
Reste = CLng(Reste * (10 + Chiffre))
Next
Return Res
End Function
Sub Main()
Console.WriteLine(Décode(1331))
Console.ReadLine()
End Sub |
Dans cette exemple 1000 convertie sans 0 = 1331
A l'inverses le résulta devrais être: 1331 = 1000