Bonjour à tous,
mon problème, c'est que mon petit programme ci-dessous ne me sort pas la réponse attendue 1031 au lieu de 1000.
Ce programme est sensé me décoder des nombres codés en base sans zéro, donc 10 devient 11 ce qui décale tout vers le haut, 20 devient 22, car 18 qui est un multiple de 9 devient 19 puisque tout est décalé vers le haut et 19 devient 21 car le zéro n’existe pas, 100 = 121 par le même système, d'ailleurs voici le code qui sert à coder les nombres décimaux en code sans zéro.
Comme je ne suis pas très clair dans mes explications, voici le programme servant à coder
Module Module1
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(4294967296))
Console.ReadLine()
End Sub
End Module
Et le code servant à décoder
Module Module1
Function PowQ(ByVal Nombre_Q As Int64, ByVal Puissance As Int64, ByVal Resulta_Q As Int64) As Int64
Resulta_Q = 1
For j = 1 To Puissance
Resulta_Q *= Nombre_Q
Next
Return Resulta_Q
End Function
Function Décoder(ByVal Nombre As Int64) As Int64
Dim Resultat As Int64
Dim Div10 As Int64
Dim Mul9 As Int64
Dim C1 As Int64
Dim Reste As Int64
Dim Chiffre As Int64
Dim NombreChiffre As Int64
Resultat = Nombre
NombreChiffre = CLng(Fix(Math.Log10(Nombre))) + 1
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
Resultat = CLng(Resultat - (i * Mul9 * (Chiffre + Reste)))
Reste = CLng(Reste * (10 + Chiffre))
Next
Return Resultat
End Function
Sub Main()
Console.WriteLine(Décoder(1331))
Console.ReadLine()
End Sub
End Module
Tout homme doit être poli ; mais il doit aussi être libre.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 23 juin 2013 à 18:05
Bonjour, Zermelo.
Je t'approuve.
Quant à Micoute, dont le code exposé montre qu'il veut pouvoir traduire dans les deux sens, je ne puis que l'inviter à réfléchir :
- sur le sens de ce que j'ai dit plus haut :
l'utilisation de divisions "entières" ou de modulos entraine l'irréversibilité (que ce soit d'un codage ou d'un calcul)
- sur le fait qu'un système intelligent, quel qu'il soit, doit permettre toutes les opérations dans cette représentation (sans, donc, décoder, puis opérer, puis recoder).
Qu'il réfléchisse par exemple à la raison de l'abandon de la représentation romaine...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Je crois comprendre que vous vous intéressez au système de numération 9-adique. Votre fièvre de conversion ne serait donc pas éteinte.
Dans cette hypothèse, vous trouverez sur internet les équations nécessaires et suffisantes. Il vous suffira alors de
1) Comprendre ces équations, et s'il le faut élever votre niveau en mathématiques.
2) Traduire ces équations en code, et s'il le faut élever votre niveau en programmation.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 23 juin 2013 à 17:08
Bonjour,
je crois plutôt qu'il cherche à faire un système décimal sans zéro.
Auquel cas il n'est pas possible d'attribuer une représentation décimale au 10, par exemple. Il est alors nécessaire de lui substituer une lettre (la lettre "A" par convention).
Ainsi :
10 ==>> A
20 ==> 1A
30 ==> 2A
...
90 ==> 8A
100 ==> 9A
...
1000 ==> 99A
etc...
Dans un tel système : tous les nombres décimaux "normaux" ne contenant aucun 0 ont la même représentation en système décimal sans 0.
Ceux qui contiennent un ou plusieurs 0 doivent par contre être convertis (insertion de A)
exemples :
1110 ==> AAA
2010 ==> 19AA
1503 ==> 14A3
etc ...
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 23 juin 2013 à 17:10
Je voudrais simplement rappeler une évidence : l'utilisation de divisions "entières" ou de modulos entraine l'irréversibilité (que ce soit d'un codage ou d'un calcul)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Ce que tu dis là m'a aussi traversé l'esprit, d'autant que je l'ai trouvé dans le même article de Wikipédia. Il n'empêche que l'ami Micoute devra pour arriver à ses fins créer un algorithme puis le coder. Alors qu'il espérait qu'on lui corrige son code, comme il a fait naguère.
Alors qu'il espérait qu'on lui corrige son code, comme il a fait naguère.
je crois bien que vous avez tout compris, quand je ne trouve pas la réponse, je me retourne toujours vers quelqu'un qui pourrait m'aider.
les procédures que je vous ai fournies fonctionnent très bien avec PureBasic, c'est pourquoi j'ai été surpris de voir que ça ne fonctionne pas en Visual Basic, pourtant le principe est très simple puisqu'il suffit de calculer combien le nombre est-il divisible par 9 et d'y rajouter le nombre, par exemple 10\9 = 1+10 = 11 et ça fonctionne avec tous les nombres.
Je vous remercie encore de vous être intéressés à mon problème.
Tout homme doit être poli ; mais il doit aussi être libre.
Merci encore de m'avoir guidé pour trouver la solution que voici:
Module Module1
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 = 0 'Nombre
Div10 = PowQ(10, NombreChiffre, Div10)
For i = NombreChiffre - 1 To 0 Step -1
Div10 \= 10
C1 = CLng(Nombre \ Div10)
Chiffre = CLng(Fix(C1) - Fix(CLng(C1) \ 10) * 10)
Mul9 = PowQ(9, i, Mul9)
Res += Mul9 * Chiffre
Next
Return Res
End Function
Sub Main()
Console.WriteLine(Décode(27726677999))
Console.ReadLine()
End Sub
End Module
Tout homme doit être poli ; mais il doit aussi être libre.