Nombre sans 0
Résolu/Fermé
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
-
Modifié par Dayvid le 2/06/2013 à 14:56
Dayvid Messages postés 20 Date d'inscription dimanche 2 juin 2013 Statut Membre Dernière intervention 26 septembre 2013 - 26 sept. 2013 à 01:57
Dayvid Messages postés 20 Date d'inscription dimanche 2 juin 2013 Statut Membre Dernière intervention 26 septembre 2013 - 26 sept. 2013 à 01:57
A voir également:
- Nombre sans 0
- Excel afficher 0 avant nombre - Guide
- Nombre facile - Télécharger - Outils professionnels
- En raison d'un nombre important d'échec de connexion snapchat - Forum Snapchat
- Erreur 0 free - Forum Samsung
- Free erreur 0 - Forum Mobile
16 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 juin 2013 à 20:39
2 juin 2013 à 20:39
Je ne parle pas VB.NET, alors j'ai fait un code Java, mais j'ai utilisé des choses très simples, qui se retrouvent dans la plupart des langages...
Voici comment passer de la base 10 à l'écriture sans 0.
Ce n'est pas vraiment optimisé, mais ce n'est pas très lourd non plus...
Remarque : ce code est correct pour n'importe quel entier, du plus petit au plus grand, et est tout à fait transposable à des BigInteger.
Pour l'algorithme dans l'autre sens il faut enlever toutes les retenues que l'on a ajouté ici, en faisant un raisonnement comparable.
Voici comment passer de la base 10 à l'écriture sans 0.
Ce n'est pas vraiment optimisé, mais ce n'est pas très lourd non plus...
public static long transformer(long entier) { // À toutes les dizaines on est décalé d'une unité, ça donne une retenue long retenue = (entier-1)/9; // on ajoute la retenue au résultat long resultat = entier+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... int rang = 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; } return resultat; // résultat correct }
Remarque : ce code est correct pour n'importe quel entier, du plus petit au plus grand, et est tout à fait transposable à des BigInteger.
Pour l'algorithme dans l'autre sens il faut enlever toutes les retenues que l'on a ajouté ici, en faisant un raisonnement comparable.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
2 juin 2013 à 16:38
2 juin 2013 à 16:38
D'un point de vue algébrique ta deuxième colonne ne peux pas être considéré comme une base numérique. Si tu es "nul en math" je ne vais pas détailler pourquoi, mais d'un point de vue du vocabulaire n'utilise pas le terme de "base 9", c'est faux.
Ensuite, si tu veux de l'efficacité dans tes résultats, il ne faut pas réfléchir en conversion base 10 → "base 9", puisque la base 10 n'est de de toute façon pas naturelle pour l'ordinateur, il faut directement réfléchir en base 2, pour les deux colonnes de ton tableau, et déterminer quelles opérations binaires permettent de passer d'une colonne à l'autre.
Après, je pense que des outils d'intelligence artificielle (un perceptron par exemple) permettraient de rapidement déterminer des relations simples entre les bits de chacune des deux colonnes. Il faudrait fouiller internet pour trouver un outil déjà prêt où tu n'as plus qu'à amorcer la phase d'apprentissage et recueillir les résultats.
Ensuite, si tu veux de l'efficacité dans tes résultats, il ne faut pas réfléchir en conversion base 10 → "base 9", puisque la base 10 n'est de de toute façon pas naturelle pour l'ordinateur, il faut directement réfléchir en base 2, pour les deux colonnes de ton tableau, et déterminer quelles opérations binaires permettent de passer d'une colonne à l'autre.
1 : 00001 00001 : 1 2 : 00010 00010 : 2 3 : 00011 00011 : 3 4 : 00100 00100 : 4 5 : 00101 00101 : 5 6 : 00110 00110 : 6 7 : 00111 00111 : 7 8 : 01000 01000 : 8 9 : 01001 01001 : 9 10 : 01010 01011 : 11 11 : 01011 01100 : 12 12 : 01100 01101 : 13 13 : 01101 01110 : 14 14 : 01110 01111 : 15 15 : 01111 10000 : 16 16 : 10000 10001 : 17 17 : 10001 10010 : 18 18 : 10010 10011 : 19 19 : 10011 10101 : 21 20 : 10100 10110 : 22 21 : 10101 10111 : 23 22 : 10110 11000 : 24 23 : 10111 11001 : 25 24 : 11000 11010 : 26 25 : 11001 11011 : 27 26 : 11010 11100 : 28 27 : 11011 11101 : 29 28 : 11100 11111 : 31
Après, je pense que des outils d'intelligence artificielle (un perceptron par exemple) permettraient de rapidement déterminer des relations simples entre les bits de chacune des deux colonnes. Il faudrait fouiller internet pour trouver un outil déjà prêt où tu n'as plus qu'à amorcer la phase d'apprentissage et recueillir les résultats.
ryko1820
Messages postés
1677
Date d'inscription
dimanche 28 avril 2013
Statut
Membre
Dernière intervention
15 août 2021
276
Modifié par ryko1820 le 2/06/2013 à 17:18
Modifié par ryko1820 le 2/06/2013 à 17:18
Hello,
Heureusement que tu as pas mis tous les chiffres sinon on avait pas fini :)
Bon comme source de l' "algorithme" je me suis servi de Wikipedia
Ca fonctionne pour toute les bases mais quand il y a des lettres (Hexadécimal par exemple) c'est plus compliqué ...
Ce que je me demande c'est comment tu as fait si tu ne sais pas faire ? Tableau Excel ?
...
Pour passer d'un nombre K en base décimale à un nombre en base N
a/ on divise successivement K/N=D (On ne garde que la partie entière de D (pas ce qu'il y a après la virgule)) ...
Exemple avec 2004 :
Opé 1 : 2004/9=222
/!\ A chaque fois on garde les "restes" de chaque division (les modulo !) car ce sont eux qui vont servir à faire le chiffre en base 9 à la fin
(Modulo Opé 1=6) (ou ((222*9)+6)=2004)
b/ On teste si D (Le résultat) >= N alors K=D et on revient à l'étape a/ (On ne garde pas le résultat qui ne sert pas sauf pour le test)
Opé 2 : 222/9=24 Comme (D >= N) alors on revient à a/ (Modulo Opé 2=6)(ou ((24*9)+6)=222)
Opé 3 : 24/9=2 là D<N alors on garde le résultat et on passe à c/ (Modulo Opé 3=6)(ou ((2*9)+6)=24)
c/ Puis on concatene le dernier résultat avec les modulos de chaque opé en commençant par la fin
Résultat Opé 3 & Modulo Opé 3 & Modulo Opé 2 & Modulo Opé 1
2 & 6 & 6 & 6
2004 en base 9 donne 2666
Pour reconvertir de la base N vers 10 (Plus simple encore ...)
Pour tout chiffre c de rang r dans K, on calcule c×N^r
On incrémente un "r" depuis la droite vers la gauche (en commençant à 0)
Par exemple pour 2666 en base 9 (9 est notre N) :
= (2x(N^r (4eme rang)) + (6x(N^r (3eme rang)) + (6x(N^r (2eme rang)) + (6x(N^r (1er rang))
= (2x(9^3)) + (6x(9^2)) + (6x(9^1)) + (6x(9^0))
= (2x729) + (6x81) + (6x9) + (6x1)
= 1458 + 486 + 54 + 6
= 2004
J'espère que c'est clair, normalement avec cet exemple et celui de wikipedia tu à les armes pour t'en sortir ...
Bon courage :)
Heureusement que tu as pas mis tous les chiffres sinon on avait pas fini :)
Bon comme source de l' "algorithme" je me suis servi de Wikipedia
Ca fonctionne pour toute les bases mais quand il y a des lettres (Hexadécimal par exemple) c'est plus compliqué ...
Ce que je me demande c'est comment tu as fait si tu ne sais pas faire ? Tableau Excel ?
...
Pour passer d'un nombre K en base décimale à un nombre en base N
a/ on divise successivement K/N=D (On ne garde que la partie entière de D (pas ce qu'il y a après la virgule)) ...
Exemple avec 2004 :
Opé 1 : 2004/9=222
/!\ A chaque fois on garde les "restes" de chaque division (les modulo !) car ce sont eux qui vont servir à faire le chiffre en base 9 à la fin
(Modulo Opé 1=6) (ou ((222*9)+6)=2004)
b/ On teste si D (Le résultat) >= N alors K=D et on revient à l'étape a/ (On ne garde pas le résultat qui ne sert pas sauf pour le test)
Opé 2 : 222/9=24 Comme (D >= N) alors on revient à a/ (Modulo Opé 2=6)(ou ((24*9)+6)=222)
Opé 3 : 24/9=2 là D<N alors on garde le résultat et on passe à c/ (Modulo Opé 3=6)(ou ((2*9)+6)=24)
c/ Puis on concatene le dernier résultat avec les modulos de chaque opé en commençant par la fin
Résultat Opé 3 & Modulo Opé 3 & Modulo Opé 2 & Modulo Opé 1
2 & 6 & 6 & 6
2004 en base 9 donne 2666
Pour reconvertir de la base N vers 10 (Plus simple encore ...)
Pour tout chiffre c de rang r dans K, on calcule c×N^r
On incrémente un "r" depuis la droite vers la gauche (en commençant à 0)
Par exemple pour 2666 en base 9 (9 est notre N) :
= (2x(N^r (4eme rang)) + (6x(N^r (3eme rang)) + (6x(N^r (2eme rang)) + (6x(N^r (1er rang))
= (2x(9^3)) + (6x(9^2)) + (6x(9^1)) + (6x(9^0))
= (2x729) + (6x81) + (6x9) + (6x1)
= 1458 + 486 + 54 + 6
= 2004
J'espère que c'est clair, normalement avec cet exemple et celui de wikipedia tu à les armes pour t'en sortir ...
Bon courage :)
ryko1820
Messages postés
1677
Date d'inscription
dimanche 28 avril 2013
Statut
Membre
Dernière intervention
15 août 2021
276
2 juin 2013 à 22:19
2 juin 2013 à 22:19
Pour voir si ça marchait je l'ai codé et le fait est que j'ai dis une connerie :) en b/ on garde le résultat car on doit le diviser pour l'opération suivante.
ryko1820
Messages postés
1677
Date d'inscription
dimanche 28 avril 2013
Statut
Membre
Dernière intervention
15 août 2021
276
Modifié par ryko1820 le 2/06/2013 à 22:28
Modifié par ryko1820 le 2/06/2013 à 22:28
Hello,
En suivant mon algorithme (trouvé sur wiki) pour la conversion.
Je fais pas de VB.Net et en C ça aurait été un peu facile, alors j'ai fait du vbscript, freestyle :)
Un copié/collé dans un fichier texte renomé en .vbs et ça doit marcher, mais y'a pas de contrôle.
L'autre algo. me semble plus facile à mettre en oeuvre ... Je vais voir ...
Sinon ça marche pour toutes les bases sauf celle qui ont des lettres (octal, hexa, etc ...)
En suivant mon algorithme (trouvé sur wiki) pour la conversion.
Je fais pas de VB.Net et en C ça aurait été un peu facile, alors j'ai fait du vbscript, freestyle :)
Un copié/collé dans un fichier texte renomé en .vbs et ça doit marcher, mais y'a pas de contrôle.
Dim nbToConvert, baseToconvertIn, myArrResult(3), myModuloMem(1024), i, j, myResult nbToConvert=InputBox("Enter your number in base 10") baseToconvertIn=InputBox("Enter base") nbToConvert=(nbToConvert-0) 'Conversion en chiffre ;) baseToconvertIn=(baseToconvertIn-0) i=0 j=0 Call divideAndSee(nbToConvert,baseToconvertIn) function Main(MyArrResult) myModuloMem(i)=myArrResult(2) i=i+1 if (myArrResult(0)=0) Then nbToConvert=myArrResult(1) Call divideAndSee(nbToConvert,baseToconvertIn) Else myResult=Cstr(myArrResult(1)) For j=i to 0 Step -1 myResult=myResult & myModuloMem(j) Next End If End Function wscript.echo ("Resultat = " & myResult) Function divideAndSee(nbToConvert,baseToconvertIn) if ((nbToConvert\baseToconvertIn)>=baseToconvertIn) Then myArrResult(0)=0 myArrResult(1)=(nbToConvert\baseToconvertIn) myArrResult(2)=(nbToConvert Mod baseToconvertIn) Else ' (nbToConvert<baseToconvertIn) Dernière passe myArrResult(0)=1 myArrResult(1)=(nbToConvert\baseToconvertIn) myArrResult(2)=(nbToConvert Mod baseToconvertIn) End If call Main(myArrResult) 'On appelle la fonction appelante :) End Function
L'autre algo. me semble plus facile à mettre en oeuvre ... Je vais voir ...
Sinon ça marche pour toutes les bases sauf celle qui ont des lettres (octal, hexa, etc ...)
ryko1820
Messages postés
1677
Date d'inscription
dimanche 28 avril 2013
Statut
Membre
Dernière intervention
15 août 2021
276
>
ryko1820
Messages postés
1677
Date d'inscription
dimanche 28 avril 2013
Statut
Membre
Dernière intervention
15 août 2021
Modifié par ryko1820 le 2/06/2013 à 23:17
Modifié par ryko1820 le 2/06/2013 à 23:17
Pour rester dans l'algo donné au départ , c'est vrai que l'opération inverse était beaucoup plus simple ... Encore du VBS alors un copié / collé dans un fichier texte renommé en .VBS et ça roule.
Ça semble marcher mais pas de "sécurité" .
Dim nbToConvert, baseToconvertFrom, nbRang, myArrResult(1024), i, myResult nbToConvert=InputBox("Enter your number in base N") baseToconvertFrom=InputBox("Enter base type") nbRang=len(nbToConvert) baseToconvertFrom=(baseToconvertFrom-0) 'Conversion en chiffre ;) (Pas pour nbToConvert ça m'arrange qu'il soit en string) i=0 for i=nbRang to 1 step -1 myChiffre=(Left(nbToConvert,1)-0) nbToConvert=right(nbToConvert,(i-1)) myArrResult(i-1)=myChiffre*(baseToconvertFrom^(i-1)) Next myResult=0 i=0 for i=nbRang to 1 step -1 myResult=myresult + myArrResult(i-1) Next wscript.echo (myResult)
Ça semble marcher mais pas de "sécurité" .
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
7 juin 2013 à 20:28
7 juin 2013 à 20:28
KX, tu veux bien stp me dire comment je dois procéder pour faire l'inverse ?
Explique clairement stp, merci !
Explique clairement stp, merci !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
Modifié par Dayvid le 16/06/2013 à 11:43
Modifié par Dayvid le 16/06/2013 à 11:43
Salut,
Vraiment j'y arrive pas :(
J'ai essayer ça mais ça marche pas (En pleur)
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
Vraiment j'y arrive pas :(
J'ai essayer ça mais ça marche pas (En pleur)
Procedure Transformer2(Nombre.q) ; À toutes les dizaines on est décalé d'une unité, ça donne une Retenue Retenue = Nombre / 10 ; On ajoute la Retenue au résultat Resultat = Nombre - 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... Rang = 1 ; On s'arrête quand il n'y a plus de Retenue à ajouter While Retenue > 0 ; Nouvelle Retenue à ajouter Retenue = (10 * Rang) * (Retenue / (10 * Rang)) ; Ajout de la Retenue Resultat - Retenue ; Passage au Rang suivant Rang * 10 Wend ProcedureReturn Resultat EndProcedure
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
2 juin 2013 à 17:24
2 juin 2013 à 17:24
Je vous remercie pour votre aide,
Effectivement KX, tu as parfaitement raison je suppose !
Ma vision est faussé, je fais avec se que je sais !
En faite, moi je cherche la logique, y dois bien y en avoir une quand même !
Mais même avec une feuille et un crayon, impossible de savoir snif.
ryko1820, Lol, oui comme tu dis heureusement mais si j'ai mis ça c'est
pour une très bonne raison ^^, pour bien voir !
De plus je suis désoler, vraiment mais c'est un peut compliquer pour moi
se que tu viens de dire, et puis comme la si bien dis KX, même ainsi
ça ne marche pas, prends exemple par exemple de:
99
999
9999
99999
999999
Ou autre, en faite avec cette méthode ça marche pas !
Sa marche presque oui mais en faite non ^^, dommage snif.
Bien ^^, sur se, j'ai déjà poser des question comme ça à droite et à gauche
et quelqu'un ma fait se code qui marche super bien:
Le problème est que j'y comprends rien --'
Quelqu'un pourrais t-il la rendre beaucoup plus clair avec pas mal de commentaire s'il vous plait :)
Qui plus est, snif, ça marche mais... j'ai pas le code qui permet de faire l'inverses
Bhouuuuuuuuuuu snif :(.
Voilà, je suis coincé quoi et je peut même pas me débrouillé seul et ça c'est chiant :(
Alors je suis obliger de venir pleurer ici pour demander de l'aide, la personne qui à crée se code ne veux pas faire le code inverse :(
C'est bien... je suis content... mais en faite je peut rien faire :(
Voilà, je supplie votre aide s'il vous plait.
Merci d'avance ! :)
Effectivement KX, tu as parfaitement raison je suppose !
Ma vision est faussé, je fais avec se que je sais !
En faite, moi je cherche la logique, y dois bien y en avoir une quand même !
Mais même avec une feuille et un crayon, impossible de savoir snif.
ryko1820, Lol, oui comme tu dis heureusement mais si j'ai mis ça c'est
pour une très bonne raison ^^, pour bien voir !
De plus je suis désoler, vraiment mais c'est un peut compliquer pour moi
se que tu viens de dire, et puis comme la si bien dis KX, même ainsi
ça ne marche pas, prends exemple par exemple de:
99
999
9999
99999
999999
Ou autre, en faite avec cette méthode ça marche pas !
Sa marche presque oui mais en faite non ^^, dommage snif.
Bien ^^, sur se, j'ai déjà poser des question comme ça à droite et à gauche
et quelqu'un ma fait se code qui marche super bien:
Function NombreSansZéro(n As Int64) As Long Dim m = CInt(Math.Floor(Math.Log(8L * n + 1L, 9))) Dim b = Function(_j As Int64) (8L * n + 1L - CLng(Math.Pow(9, m))) \ (8L * CLng(Math.Pow(9, _j))) Return Enumerable.Range(0, m).Sum(Function(j) (1L + b(j) Mod 9L) * CLng(Math.Pow(10, j))) End Function
Le problème est que j'y comprends rien --'
Quelqu'un pourrais t-il la rendre beaucoup plus clair avec pas mal de commentaire s'il vous plait :)
Qui plus est, snif, ça marche mais... j'ai pas le code qui permet de faire l'inverses
Bhouuuuuuuuuuu snif :(.
Voilà, je suis coincé quoi et je peut même pas me débrouillé seul et ça c'est chiant :(
Alors je suis obliger de venir pleurer ici pour demander de l'aide, la personne qui à crée se code ne veux pas faire le code inverse :(
C'est bien... je suis content... mais en faite je peut rien faire :(
Voilà, je supplie votre aide s'il vous plait.
Merci d'avance ! :)
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
4 juin 2013 à 19:59
4 juin 2013 à 19:59
KX, tu veux bien s'il te plait m'aider à faire le code de décodage :)
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
6 juin 2013 à 10:36
6 juin 2013 à 10:36
Personne svp ?
ryko1820
Messages postés
1677
Date d'inscription
dimanche 28 avril 2013
Statut
Membre
Dernière intervention
15 août 2021
276
6 juin 2013 à 10:41
6 juin 2013 à 10:41
hello,
je t'ai déjà donné un algo. pour la conversion de base N en base 10 ...
Il est généraliste (applicable à toute les bases et pas optimisé à ton problème spécifique : base 9) mais tellement simple qu'il doit être assez rapide et en tous cas opérationnel.
Sinon en repartant du prog. de KX et en inversant la logique c'est pas bien compliqué non plus.
je t'ai déjà donné un algo. pour la conversion de base N en base 10 ...
Il est généraliste (applicable à toute les bases et pas optimisé à ton problème spécifique : base 9) mais tellement simple qu'il doit être assez rapide et en tous cas opérationnel.
Sinon en repartant du prog. de KX et en inversant la logique c'est pas bien compliqué non plus.
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
16 juin 2013 à 18:15
16 juin 2013 à 18:15
Je peut avoir de l'aide svp ?!
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
Modifié par Dayvid le 17/06/2013 à 18:59
Modifié par Dayvid le 17/06/2013 à 18:59
Help !!!
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
Modifié par Dayvid le 19/06/2013 à 18:47
Modifié par Dayvid le 19/06/2013 à 18:47
Bonjour,
KX, voici une procédure pour faire l'inverse, elle n'est pas de moi évidement car déjà que j'arrive même pas à comprendre ta première procédure qui est excellente je le rappel auquel je te remercie énormément ! ^^
Stp peux tu me faire voir comment toi tu procèderais :)
Je suis sur que tu peut faire bien mieux que ça :)
Elle n'est pas très optimisé, je pense qu'on peut faire
au moins deux fois plus rapide, encore merci de ton aide :)
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
KX, voici une procédure pour faire l'inverse, elle n'est pas de moi évidement car déjà que j'arrive même pas à comprendre ta première procédure qui est excellente je le rappel auquel je te remercie énormément ! ^^
Stp peux tu me faire voir comment toi tu procèderais :)
Je suis sur que tu peut faire bien mieux que ça :)
Elle n'est pas très optimisé, je pense qu'on peut faire
au moins deux fois plus rapide, encore merci de ton aide :)
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 Macro PowQ(nombre_q, puissance, resultat_q) resultat_q = 1 For j = 1 To puissance resultat_q * nombre_q Next EndMacro ; div10 = Pow(10, nb_chiffre); ne fonctionne pas avec des Quad PowQ(10, nb_chiffre, div10) ; mul9 = Pow(9, nb_chiffre - 1); ne fonctionne pas avec des Quad 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
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
19 juin 2013 à 18:57
19 juin 2013 à 18:57
La question n'est pas de savoir si moi je peux le faire, mais si TOI tu peux le faire...
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
19 juin 2013 à 19:55
19 juin 2013 à 19:55
Mais j'y arrive pas moi !
Je peut pas le faire pour le moment snif
Tu veux bien m'aider stp :)
Je peut pas le faire pour le moment snif
Tu veux bien m'aider stp :)
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
20 juin 2013 à 13:28
20 juin 2013 à 13:28
je sais pas se que j'ai pue te faire a ce point pour que tu veuille plus m'aider :(
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
21 juin 2013 à 11:28
21 juin 2013 à 11:28
Voici le code traduit en VB.Net
Normalement je me suis pas trompé si ce n'est que cella ne fonctionne pas correctement !
Serais t-il possible de corriger ou me dire se qui ne va pas svp :)
Normalement je me suis pas trompé si ce n'est que cella ne fonctionne pas correctement !
Serais t-il possible de corriger ou me dire se qui ne va pas svp :)
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
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
25 sept. 2013 à 16:26
25 sept. 2013 à 16:26
Bonjour,
Noter que le système de base se défini comme suit :
K
Noter que le système de base se défini comme suit :
Donc par définition, toutes les bases contiennent le symbole [ 0 ].
Base 10 (0123456789)
Base 9 (012345678)
Base 8 (01234567)
Base 7 (0123456)
Base 6 (012345)
Base 5 (01234)
Base 4 (0123)
Base 3 (012)
Base 2 (01)
Base 11 (0123456789A)
Base 12 (0123456789AB)
Base 13 (0123456789ABC)
Base 14 (0123456789ABCD)
Base 15 (0123456789ABCDE)
Base 16 (0123456789ABCDEF)
K
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
25 sept. 2013 à 19:04
25 sept. 2013 à 19:04
À condition de considérer que l'alphabet du codage est 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F...
Mais rien ne nous empêche de considérer un autre alphabet, par exemple en décalant tout l'alphabet pour avoir 0 → 1 // 1 → 2 // 2 → 3... Mais il faudrait quand même respecter les contraintes d'algèbres, c'est à dire que k+0=k → k+1=k // k*1=k → k*2=k
Mais tout cela ne se retrouvait pas dans les exemples d'échantillon donné par Dayvid, en particulier parce que l'on aurait du avoir 1=11=111 (de même qu'on a 0=00=000...)
Ce qu'il recherchait n'avait donc rien à voir avec une base (au sens algébrique), mais c'était quand même une bijection d'une base 10 {0,1,2,3,4,5,6,7,8,9} vers une base 9 {1,2,3,4,5,6,7,8,9}
Mais rien ne nous empêche de considérer un autre alphabet, par exemple en décalant tout l'alphabet pour avoir 0 → 1 // 1 → 2 // 2 → 3... Mais il faudrait quand même respecter les contraintes d'algèbres, c'est à dire que k+0=k → k+1=k // k*1=k → k*2=k
Mais tout cela ne se retrouvait pas dans les exemples d'échantillon donné par Dayvid, en particulier parce que l'on aurait du avoir 1=11=111 (de même qu'on a 0=00=000...)
Ce qu'il recherchait n'avait donc rien à voir avec une base (au sens algébrique), mais c'était quand même une bijection d'une base 10 {0,1,2,3,4,5,6,7,8,9} vers une base 9 {1,2,3,4,5,6,7,8,9}
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
25 sept. 2013 à 19:28
25 sept. 2013 à 19:28
re:
Je suis d'accord avec ta remarque et j'ajouterai ceci :
Certe, je ne suis pas un expert mathématicien, par contre après 29 ans d'expérience
(16 en électronique/matériel et programmation BIOS et firmware) et (13 ans en informatique),
Il est clair que l'ordinateur ne comprend à la base que la Base 2.
Un mathématicien expérimenté à démontré que par regroupement binaire de 4 bits,
nous pouvions passer de la base 2 à la base 16 par un calcul mental très simple
(Électronique 101- Circuit logique). C'est de là que nous vient l'octet tel que conceptualiser aujourd'hui.
Or il est certain que mondialement le base 16 est identifier par les symboles
[ 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F ], ce qui n'exclus pas que quelqu'un pourrait
définir un autre suite de symbole pour un système propriétaire.
Comme je dis toujours, pourquoi faire simple qu'en on peut faire compliqué :-)
K
Je suis d'accord avec ta remarque et j'ajouterai ceci :
Certe, je ne suis pas un expert mathématicien, par contre après 29 ans d'expérience
(16 en électronique/matériel et programmation BIOS et firmware) et (13 ans en informatique),
Il est clair que l'ordinateur ne comprend à la base que la Base 2.
Un mathématicien expérimenté à démontré que par regroupement binaire de 4 bits,
nous pouvions passer de la base 2 à la base 16 par un calcul mental très simple
(Électronique 101- Circuit logique). C'est de là que nous vient l'octet tel que conceptualiser aujourd'hui.
Or il est certain que mondialement le base 16 est identifier par les symboles
[ 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F ], ce qui n'exclus pas que quelqu'un pourrait
définir un autre suite de symbole pour un système propriétaire.
Comme je dis toujours, pourquoi faire simple qu'en on peut faire compliqué :-)
K
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
25 sept. 2013 à 20:06
25 sept. 2013 à 20:06
La demande de Dayvid était un exercice d'algorithmique et tout le monde sait que ce genre d'exercices n'ont aucun intérêt ^^
Mais encore une fois ce n'était pas un changement de base, ni d'alphabet.
Sinon on n'aurait pas eu "7, 8, 9, 11, 12, 13" mais plutôt eu "7, 8, 9, 21, 22, 23", puisque sans 0 c'est le 1 qui prend sa place donc 11=1, 12=2, 13=3 (de même qu'en base 10 on a 01=1, 02=2, 03=3...)
En fait ici il s'agissait de lister les entiers un par un, sauf ceux qui contenait le chiffre 0, et associer la valeur n au nième nombre de la liste ainsi obtenu, mais sans calculer explicitement la liste.
Ça n'a donc rien à voir avec un changement de base, même si on pouvait s'y ramener de manière détournée pour faire le calcul direct...
Mais encore une fois ce n'était pas un changement de base, ni d'alphabet.
Sinon on n'aurait pas eu "7, 8, 9, 11, 12, 13" mais plutôt eu "7, 8, 9, 21, 22, 23", puisque sans 0 c'est le 1 qui prend sa place donc 11=1, 12=2, 13=3 (de même qu'en base 10 on a 01=1, 02=2, 03=3...)
En fait ici il s'agissait de lister les entiers un par un, sauf ceux qui contenait le chiffre 0, et associer la valeur n au nième nombre de la liste ainsi obtenu, mais sans calculer explicitement la liste.
Ça n'a donc rien à voir avec un changement de base, même si on pouvait s'y ramener de manière détournée pour faire le calcul direct...
Kalissi
Messages postés
218
Date d'inscription
jeudi 2 mai 2013
Statut
Membre
Dernière intervention
15 juillet 2019
20
25 sept. 2013 à 22:42
25 sept. 2013 à 22:42
re :
Merci pour la suppression en double que j'avais envoyer.
K
Merci pour la suppression en double que j'avais envoyer.
K
Salut,
ça fais un moment que le problème est résolus...
Pour convertir un nombre de base 10 vers base 9:
Pour décoder le nombre maintenant:
A noté que ses codes ne sont pas de moi, on me les à crée !
j'en est bavé pour mettre ça au point (Enfin que on me mette ça au point)
ça fais un moment que le problème est résolus...
Pour convertir un nombre de base 10 vers base 9:
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(1000))
Console.ReadLine()
End Sub
Pour décoder le nombre maintenant:
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
A noté que ses codes ne sont pas de moi, on me les à crée !
j'en est bavé pour mettre ça au point (Enfin que on me mette ça au point)
Dayvid
Messages postés
20
Date d'inscription
dimanche 2 juin 2013
Statut
Membre
Dernière intervention
26 septembre 2013
2
26 sept. 2013 à 01:57
26 sept. 2013 à 01:57
Voici un exemple concret de se que cella donne:
Module Module1
Function Base10VersBase9(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
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 Base9VersBase10(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()
Dim Nombre As Integer = 0
For i = 1 To 100
Nombre = CInt(Base10VersBase9(i))
Console.WriteLine(i & " en base 9 fait: " & Nombre)
Console.WriteLine(Nombre & " en base 10 fait: " & Base9VersBase10(Nombre))
Next
Console.ReadLine()
End Sub
End Module
2 juin 2013 à 20:58
Enfin plus ou moins...
S'il te plais, peut tu me faire la chose inverses, merci encore !
Modifié par Dayvid le 2/06/2013 à 22:53
Et je dois dire que ça à été très facile en faite ^^
Maintenant il faut juste que je comprenne mais c'est un peut se que j'avais fais sur la feuille de papier sauf que moi j'avais oublier des trucs et donc ça marchais pas ^^
Alors simplement un grand merci à toi KX, et de plus, ça me fais marrer
le premier code du gars, certes, code court mais incompréhensible ^^
Là, je peux comprendre le code car il est très simple ^^
Je vais essayer de faire travaillé mes méninges pour faire l'algo inverses maintenant que j'ai vue comment tu as fais ^^
ryko1820, ton code à l'air sympa ^^
Merci !
Le respect n'est pas une option mais une obligation !
Restons cool: politesse, patience et indulgence sont indispensable !
2 juin 2013 à 23:08
Cet algo est environ 9 fois plus rapide que le premier que j'ai donner !
Le premier, environ 18 secondes avec mon PC et là seulement 2 !
Bien jouer ! ^^
Merci beaucoup ^^
2 juin 2013 à 23:53
Sans parler de ce "Enumerable.Range(0, m).Sum..." je ne sais pas ce que c'est censé faire, mais ça a l'air compliqué ^^
3 juin 2013 à 00:14
Je te tien au courent.