Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Deux nombres en un

Posté par
bozo
03-05-14 à 18:59

Salut j'étais entrain de coder une fonction et je me demandais par pur flemmardise si on pouvait stocké deux entiers dans un seul entier puis faire le chemin inverse pour retrouver les deux entiers.

En gros j'ai une fonction qui prend en paramètre une chaine de caractère, et qui doit me renvoyer des informations sur cette chaine : nombre de mot etc.
ce que j'aimerais faire si c'est possible c'est stocker ces info dans un seul entier ca m'eviterait de faire une structure ou de renvoyer un tableau.

exemple ma fonction trouve que dans tel chaine il y a 20 caractères dont 3 virgule est ce qu'il existe une méthode pour fusionner ces deux nombres ici 20 et 3 (mais je suis pas sensé les connaitre a l'avance) en un seul nombre de tel manière que je puisse retrouver ces deux nombres quel qu'ils soient.

Posté par
alainpaul
re : Deux nombres en un 03-05-14 à 19:36

Bonsoir,


Soient a et b les deux nombres donnés,quelle est leur longueur maximale?


Alain

Posté par
bozo
re : Deux nombres en un 03-05-14 à 19:56

je suppose que plus il y a de restrictions plus ça doit être faisable donc disons 2 nombres entier strictement positif.

Posté par
lafol Moderateur
re : Deux nombres en un 03-05-14 à 20:44

Bonjour
il faudrait vraiment plus de restrictions : genre si tu sais que ces nombres sont les deux entre 0 et 99, tu peux par exemple pour 20 et 3 coder 2003 : tu sais que les centaines donnent le premier, et les deux derniers chiffres le deuxième

Posté par
bozo
re : Deux nombres en un 03-05-14 à 21:10

ouai c'est vrai que si on sait que les nombres vont être entre deux valeurs on peut faire comme ça mais si les nombres peuvent aller de 0 a l'infinie c'est impossible ?

Posté par
lafol Moderateur
re : Deux nombres en un 03-05-14 à 21:31

ça revient à chercher une bijection entre \N^2 et \N, ton truc ...

quelque chose comme (x,y) \mapsto n = f(x,y)=(2x+1)2^y-1 par exemple

(à partir de n on commence par diviser n+1 le plus de fois possible par 2 : le nombre de fois est y, et le quotient impair final est 2x+1, exemple avec 20 et 3 : on code par 327

en repartant de 327 : 328 = 2\times 164 = 2^2\times 82=2^3\times 41 = (2\times 20+1)2^3 donc x = 20 et y = 3

Posté par
bozo
re : Deux nombres en un 03-05-14 à 22:39

a vue d'oeil c'est exactement ce que je cherchais merci. est ce que c'est possible pour n nombre ? genre (x, y, z, ...) -> n et f(n) = ...

Posté par
lafol Moderateur
re : Deux nombres en un 04-05-14 à 00:40

cherche "polynômes de Cantor" sur google, mais pas sure que ce soit facile à inverser, après

Posté par
lafol Moderateur
re : Deux nombres en un 04-05-14 à 00:44

ou alors en plusieurs temps : (x,y,z) \mapsto (n=(2x+1)2^y-1, z) \mapsto (2n+1)2^z-1, etc

mais pareil, est-ce rentable ? récupérer x,y et z à partir du résultat va être rapidement fastidieux

Posté par
bozo
re : Deux nombres en un 04-05-14 à 16:36

ouai en effet ça n'a pas l'air rentable plus on a de nombre plus ça devient complexe a mois que ce soit plus rapide de faire comme ça que de déclarer un tableau d'int mais j'en doute après çà peut toujours servir.

Posté par
alainpaul
re : Deux nombres en un 05-05-14 à 14:29

De retour,

Il m'est arrivé d'utiliser la décimale pour stocker 2 nombres à la fois.

Dans le problème des q  sacs de pièces d'or on utilise aussi les puissances de 2;
n=a_0+a_1 2^1+a_2 2^2+..+a_2^{q-1}

La décomposition est unique,


Alain

Posté par
lafol Moderateur
re : Deux nombres en un 05-05-14 à 14:55

la décomposition est unique à condition que les a_i ne prennent que les valeurs 0 ou 1....

sinon, 16 = 16 + 0\times 2^1+0\times 2^2+... = 10 + 1\times 2^1+1\times 2^2 etc

Posté par
alainpaul
re : Deux nombres en un 05-05-14 à 15:49

Exactement,

Il n'est pas donc pas possible d'avoir deux entiers de
même valeur.

Voir puissances de 3 avec aj [0,1,2]


Alain

Posté par
lafol Moderateur
re : Deux nombres en un 05-05-14 à 15:52

j'ose à peine imaginer en quelle base il va devoir travailler s'il peut avoir n'importe quels entiers !

Posté par
Razes
re : Deux nombres en un 15-07-14 à 05:49

Bonsoir,

Ton sujet est intéressant, l'idée est là mais le sujet nécessite plus d'informations.
Je vais essayer de t'expliquer cela avec le peu d'informations que tu as fournis.

Prenons les hypothèses suivantes concernant les paramètres (NBC, NBP, NBL sont simplement des abréviations d'écriture):
- NBC - Nombre de caractère (contient 200 caractères), ceci veut dire que ton compteur de caractères est limité à 200 caractères au maximum. Dans ce cas nous sommes obligés de coder de Nombre de caractère sur 8bits (nombre de valeurs possible = 256 ; la valeur maximale est 255, car 0 est aussi une valeur possible) ce qui bon pour notre cas.
Par exemple : 160 caractères correspond a une écriture binaire 10100000

- NBP - Nombre de points de ponctuation (Avec un maximum de 30 points)  dans ce cas, NBP sera codé sur 5 bits ce qui est suffisant pour notre cas car (nombre de valeurs possible = 32 ; la valeur maximale est 31, car 0 est aussi une valeur possible)
Par exemple : 27 points correspond a une écriture binaire 11011

- NBL - Nombre de lignes (Avec un maximum de 7 lignes)  dans ce cas, NBL sera codé sur 3 bits ce qui est suffisant pour notre cas car (nombre de valeurs possible = 8 ; la valeur maximale est 7, car 0 est aussi une valeur possible)
Par exemple : 5 lignes correspond a une écriture binaire 101

Nous aurons donc notre paramètre  qui vaudrait \overbrace{\underbrace{10100000}_\text{NBC - 8bits}\underbrace{11011}_\text{NBCP - 5bits}\underbrace{101}_\text{NBCPL - 3bits}}^\text{parametre code sur 16 bits}

Paramètre = 1010000011011101 (41181 en décimal)

Au niveau du programme, le paramètre est codé sur 16bits, donc ce paramètre pourrait être déclaré comme integer ou short. Mais on peut aussi le coder sur 32 ou 64 bits (Dans ce cas il faut s'assurer de cela au niveau de la capacité de la machine et processeur.

Cette façon de procéder a un avantage ainsi que des inconvénients, généralement elle est utilisée quand il y a beaucoup de donnée car dans ce cas là la moindre économie de bits est importante. Son inconvénients, c'est le traitement car pour récupérer tes données par exemple NBC, NBP et NBL, il faut écrire quelques routines (opérateurs bits à bits, filtres, …) pour l'extraction et de combinaison des données.

Avec la méthode classique struct ou class, l'accès est beaucoup plus facile, ne nécessite pas de routines au niveau binaire, mais on perd des bits inutilisés par-ci et par-là.

Par ailleurs concernant le fait de grouper deux nombres dans un seul paramètre, c'est possible mais il faudrait voir la taille maximale de ces nombres. Ainsi que celle du paramètre.

Posté par
lafol Moderateur
re : Deux nombres en un 15-07-14 à 10:57

Razes, encore une fois tu réponds à côté de la question .... il faudrait vraiment lire les posts ....

Citation :
exemple ma fonction trouve que dans tel chaine il y a 20 caractères dont 3 virgule est ce qu'il existe une méthode pour fusionner ces deux nombres ici 20 et 3 (mais je suis pas sensé les connaitre a l'avance) en un seul nombre de tel manière que je puisse retrouver ces deux nombres quel qu'ils soient.

Posté par
carpediem
re : Deux nombres en un 15-07-14 à 12:22

salut

soit à coder m et n en un seul nombre

posons k = E \left( \dfrac {ln  n}{ln  10} \right) et x = m + 10^{-k}n

k est le nombre de chiffre de n (peut-être considérer k \pm 1 )

alors m = E(x)  et  n = 10^k(x - E(x))


il n'y a alors plus qu'une seule information puisque les applications (m, n) --> x et x --> (m, n) permettent à chaque fois de trouver k

mais je ne pense pas que ce soit pertinent en nombres d'opérations effectuées ...

de plus il ne faut pas que les nombres m et n ne soient trop grands sinon il apparaitra des arrondis

ce me semble-t-il ...



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !