Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1890 connectés 

  FORUM HardWare.fr
  Programmation

  [DETENTE][ALGO] Permuter 2 variables a et b ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[DETENTE][ALGO] Permuter 2 variables a et b ...

n°73470
HelloWorld
Salut tout le monde!
Posté le 19-11-2001 à 13:59:24  profilanswer
 

bah c'est facile ...
c = a;
a = b;
b = c;
 
oui, mais savez vous que c'est possible sans troisieme varible !
Sans aucune variable intermediaire (et sans bidouille du genre l'instruction XCHG du processeur)
 
Alors, qui a une idee ? ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 19-11-2001 à 13:59:24  profilanswer
 

n°73471
dropsy
et bonne chance surtout...
Posté le 19-11-2001 à 14:00:35  profilanswer
 

tu me dis si je me trompe, mais la bidouille sans 3ième variable ne marche que sur des nombres, non?

n°73474
TheJackal
Posté le 19-11-2001 à 14:12:11  profilanswer
 

dropsy: non, pkoi que avec des nombres?
 
je crois pas que ca existe pas sans troisieme var...

 

[edtdd]--Message édité par TheJackal--[/edtdd]

n°73477
youdontcar​e
Posté le 19-11-2001 à 14:14:54  profilanswer
 

push a
push b
pop a  
pop b
 
autre chose ? :lol: sinon y'a un bidouille à coups de xor je crois ...

n°73479
TheJackal
Posté le 19-11-2001 à 14:16:52  profilanswer
 

:sarcastic:  :D

n°73484
dropsy
et bonne chance surtout...
Posté le 19-11-2001 à 14:23:01  profilanswer
 

TheJackal a écrit a écrit :

dropsy: non, pkoi que avec des nombres?
 
ca existe pas sans troisieme var  
 
 




 
bon, alors g pas la bonne méthode :(
 
moi je fais:
a=a+b;
b=a-b;
a=a-b;
 
mais c pas jolie pr une string

n°73486
TheJackal
Posté le 19-11-2001 à 14:26:47  profilanswer
 

pour un char* non pas du tout :D

 

[edtdd]--Message édité par TheJackal--[/edtdd]

n°73493
BENB
100% Lux.
Posté le 19-11-2001 à 14:55:25  profilanswer
 

TheJackal a écrit a écrit :

pour un char* non pas du tout :D  
 
 




caste le en long pour faire l'operation :D

n°73502
TheJackal
Posté le 19-11-2001 à 15:19:54  profilanswer
 

BENB a écrit a écrit :

 
caste le en long pour faire l'operation :D  




 :heink: :ouch:  :D

n°73518
camarchepo​a
m'enfin !
Posté le 19-11-2001 à 16:07:03  profilanswer
 

moi je dit avec ce coup la HelloWorld a droit a une promotion  :)  
 
ct quoi le deuxieme mot qu'ils ont dit  ;)  :D  
 
sinon dropsy il etait pas loin :jap:


---------------
Ca marche pas sauf des fois ........
mood
Publicité
Posté le 19-11-2001 à 16:07:03  profilanswer
 

n°73531
HelloWorld
Salut tout le monde!
Posté le 19-11-2001 à 16:23:29  profilanswer
 

Bien joue dropsy !
Donc je confirme :
 
a = a+b;  
b = a-b;  
a = a-b;
 
youdontcare>
push a  
push b  
pop a  
pop b  
 
t'utilises non pas une variable intermediaire mais carement deux ... ;)
he! la pile, ca prend de la place !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°73533
dropsy
et bonne chance surtout...
Posté le 19-11-2001 à 16:25:45  profilanswer
 

:bounce:   :bounce:  
bon, ben g bon   :??:   :??: ms se pose toujours le pbm des strings, non??  :??:   :??:

n°73535
HelloWorld
Salut tout le monde!
Posté le 19-11-2001 à 16:31:39  profilanswer
 

hum, c'est pas faux.
j'y avais pas pense a ca.
mais, attend voire ...

Code :
  1. char ch1[10];
  2. char ch2[10];
  3. int i;
  4. (...)
  5. for(i=0; i<10; i++)
  6. {
  7.     ch1[i] += ch2[i];
  8.     ch2[i] =  ch1[i] - ch2[i];
  9.     ch1[i] -= ch2[i];
  10. }


 
sattisfait ? :)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°73539
dropsy
et bonne chance surtout...
Posté le 19-11-2001 à 16:46:23  profilanswer
 

ouaips ca a une tete sympa

n°73542
barbarella
Posté le 19-11-2001 à 16:52:56  profilanswer
 

échange moi les valeurs,
 
a = (2^32)-1;
b = (2^32)-2;
 
avec a et b en unsigned long.

n°73543
n0mad
inscrit au XXe siècle
Posté le 19-11-2001 à 16:55:19  profilanswer
 

Problème connu en ASM pour échanger 2 valeurs quelconques :
 
a = a xor b
b = a xor b
a = a xor b
 
difficile de faire plus rapide en terme de cycle : 3 XOR au lieu de 3 MOV et une variable supplémentaire.

 

[edtdd]--Message édité par n0mad--[/edtdd]


---------------
Pipiru piru piru pipiru pi
n°73558
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-11-2001 à 17:13:06  profilanswer
 

BENB a écrit a écrit :

 
caste le en long pour faire l'operation :D  




 
note que ça doit marcher, on ne fait qu'échanger des pointeurs, c'est des entiers
d'ailleurs char* est un entier, puisque pointeur vers une chaîne de caractère... (non ? je sais plus :sweat:)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°73560
BENB
100% Lux.
Posté le 19-11-2001 à 17:16:33  profilanswer
 

antp a écrit a écrit :

 
 
note que ça doit marcher, on ne fait qu'échanger des pointeurs, c'est des entiers
d'ailleurs char* est un entier, puisque pointeur vers une chaîne de caractère... (non ? je sais plus :sweat:)  




 
Oui ca marche.... mais c'est pas beau :D

n°73568
camarchepo​a
m'enfin !
Posté le 19-11-2001 à 17:31:55  profilanswer
 

HelloWorld a écrit a écrit :

hum, c'est pas faux.
j'y avais pas pense a ca.
mais, attend voire ...

Code :
  1. char ch1[10];
  2. char ch2[10];
  3. int i;
  4. (...)
  5. for(i=0; i<10; i++)
  6. {
  7.     ch1[i] += ch2[i];
  8.     ch2[i] =  ch1[i] - ch2[i];
  9.     ch1[i] -= ch2[i];
  10. }


 
sattisfait ? :)  




 
oui mais ................. i c bien une variable, non  ;)  
alors ca compte qd même ou pas  :sarcastic:


---------------
Ca marche pas sauf des fois ........
n°73570
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-11-2001 à 17:34:12  profilanswer
 

BENB a écrit a écrit :

 
 
Oui ca marche.... mais c'est pas beau :D  




 
pas beau ? on ne fait qu'échanger des pointeurs !!
c'est nettement plus beau que la solution de recopier caractère par caractère (quel est l'intérêt de bouger toute la mémoire quand il suffit de bouger les références)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°73612
barbarella
Posté le 19-11-2001 à 19:02:43  profilanswer
 

tu prends, tu vires,
 
ca marche que sous certaines conditions. Puis alors, le coup des additions et soustractions de pointeur, faut pas déconner.
 
A = adresse X
B = X+1
 
A = A + B donne adresse de A = indéterminé = peut correspondre a une adresse d'un autre process ou thread. Il va apprécier le SE, s'il te jette pas avec un truc du genre ' A effectuer une opératon non conforme' de temps en temps je mange un balai :D
 
Vous vous entrainez pour postuler a un post chez Microsoft ou quoi ? :D

 

[edtdd]--Message édité par Barbarella--[/edtdd]

n°73631
darkoli
Le Petit Dinosaure Bleu
Posté le 19-11-2001 à 20:34:33  profilanswer
 

a=2
b=5
 
b=a+b  // a=2, b=7
a=b-a  // a=5, b=7
b=a-b  // a=5, b=2
 
voila je crois que ca marche bien !!!


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°73639
TheJackal
Posté le 19-11-2001 à 21:09:55  profilanswer
 

c plus lent que le premier ex, et puis essaye avec des pointeurs comme dropsy voulait faire :D

n°73721
dropsy
et bonne chance surtout...
Posté le 20-11-2001 à 10:46:45  profilanswer
 

:??: ah bon? je voulais faire ca avec des pointeurs?
non, ce que je dis, c que la solution que je donne marche pour ce qui est des nombres (et encore, à condition de pas dépasser les limites de ces nombres)
après, pour des pointeurs... c un autre pbm

n°73726
youdontcar​e
Posté le 20-11-2001 à 10:52:37  profilanswer
 

je ne vois pas pourquoi la solution xor ne marcherait pas tout le temps et sur tous types de variables (flottants, entiers, pointeurs ...)  
:??:

n°73729
BENB
100% Lux.
Posté le 20-11-2001 à 10:55:14  profilanswer
 

antp a écrit a écrit :

 
 
pas beau ? on ne fait qu'échanger des pointeurs !!
c'est nettement plus beau que la solution de recopier caractère par caractère (quel est l'intérêt de bouger toute la mémoire quand il suffit de bouger les références)  




c'est le cast qui n'est pas beau... et comme le dis Barbarella
le ponteur qui a recu a+b il pointe n'importe ou...
et il y a le Pb des limites sur les station HP sur lequelles je travaillais il n'y a pas si longtemps les adresse memoire commecaient toutes par 0x8.....

n°73772
n0mad
inscrit au XXe siècle
Posté le 20-11-2001 à 11:37:31  profilanswer
 

BENB a écrit a écrit :

 
c'est le cast qui n'est pas beau... et comme le dis Barbarella
le ponteur qui a recu a+b il pointe n'importe ou...
et il y a le Pb des limites sur les station HP sur lequelles je travaillais il n'y a pas si longtemps les adresse memoire commecaient toutes par 0x8.....  




 
C'est pour ça que ma méthode avec XOR (un peu plus haut dans le thread) est bien plus soft car il n'y a pas de risque de dépassement.


---------------
Pipiru piru piru pipiru pi
n°73797
gilou
Modérateur
Modzilla
Posté le 20-11-2001 à 12:56:32  profilanswer
 

C' est connu:
a^=b;
b^=a;
a^=b;
Mais c'est un artifice d'ecriture: a un moment donne, il y a un registre temporaire d'utilise.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [DETENTE][ALGO] Permuter 2 variables a et b ...

 

Sujets relatifs
[Algo] Faire la part entre des data et des command...Afficher des variables en mode graphique sous Dos ?
algo pour suppression de lignes en double ds un fichier ??[ALGO/MATHS] et encore un chti :p (pb de colision)
Access : concatener un texte avec de variables[VB] Probleme de passage de variables !!!
[algo] Ensemble des parties[zip] algo de compression / décompression
[PHP] Problème de passage de variablesBESOIN D'AIDE EN ALGO
Plus de sujets relatifs à : [DETENTE][ALGO] Permuter 2 variables a et b ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR