Réponse erronée

Résolu
Micoute - 23 juin 2013 à 08:36
 Micoute - 23 juin 2013 à 18:23
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.

7 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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.
3
Bonjour Micoute.

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.

Bon courage.

Étant illettré, je signe d'une croix : ×
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour ucfoutu.

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.

Amicales salutations.


Étant illettré, je signe d'une croix : ×
0
Merci beaucoup mes chers amis Zermelo et ucfoutu,
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.
0
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.
0
Rejoignez-nous