Algorithme de bits...

Algorithme de bits... - C++ - Programmation

Marsh Posté le 24-03-2003 à 18:51:02    

Code :
  1. /*
  2.     Algorithme repondant a la question "Combien de fois un word (16 bits) peut t-il avoir la moitié de ses bits identiques ?"
  3. */
  4. #define NombreBits 16
  5. int main()
  6. {
  7.     int A, B, taille, i, I;
  8.     char binaire[NombreBits];
  9.    
  10.     A = 0;
  11.     taille = sizeof(binaire) - 1;
  12.     for (i = 0; i <= taille; i++)  binaire[i] = '0';
  13.    
  14.     do
  15.     {
  16.         for (i = 0; i <= taille; i++)
  17.         {
  18.                 I = taille - i;
  19.                 if (binaire[I] == '0')
  20.                 {
  21.                         binaire[I] = '1';
  22.                         if (I != 0) while ((I != 0) && (I < taille) && (I++)) binaire[I] = '0';
  23.                         break;
  24.                 }
  25.         }
  26.        
  27.         for (i = 0, B = 0; i <= taille; i++) if (binaire[i] == '1') B++;
  28.         if (B == (NombreBits / 2)) A++;
  29.     } while (B != sizeof(binaire) - 1);
  30.    
  31.     printf("Un nombre binaire de %u bits a la moitie de ses bits identiques %u fois !\n", NombreBits, A);
  32.     getch();
  33.        
  34.     return 0;
  35. }


 
Peut-on l'optimiser un peu plus ?  :??:  
 
Merci d'avance.  :hello:

Reply

Marsh Posté le 24-03-2003 à 18:51:02   

Reply

Marsh Posté le 24-03-2003 à 19:01:19    

bah déjà la question est pas claire je trouve...

Reply

Marsh Posté le 24-03-2003 à 19:03:43    

Par optimisisation, je veux dire code plus petit et plus rapide  :p  
 
Si tu parles de la question a laquelle l'algo doit répondre, ben euh tu comprends pas le francais alors  :whistle:

Reply

Marsh Posté le 24-03-2003 à 19:14:44    

Si tu as n bits (n étant pair), tu veux savoir le nombre de mots à n bits différents ayant la moitié de ses bits à 1.  
 
C'est le nombre de choix de n/2 places parmi n, soit le nombre de combinaison de n/2 parmi n. Formule des C(n,k)
 
C'est donc : n!/((n-n/2)!*(n/2)!) = n!/((n/2)!*(n/2)!)
 
Je pense que ca doit être ca.


Message édité par Evadream -jbd- le 24-03-2003 à 19:30:06
Reply

Marsh Posté le 24-03-2003 à 19:30:33    

Evadream -jbd- a écrit :

Si tu as n bits (n étant pair), tu veux savoir le nombre de mots à n bits différents ayant la moitié de ses bits à 1.  
 
C'est le nombre de choix de n/2 places parmi n, soit le nombre de combinaison de n/2 parmi n. Formule des C(n,k)
 
C'est donc : n!/((n-n/2)!) = n!/((n/2)!)
 
Je pense que ca doit être ca.

je suis presque d'accord sauf que j'aurais plutot vu un arrangement

Reply

Marsh Posté le 24-03-2003 à 20:03:14    

Je suis une mega kiche en dénombrement :D
 
Mais prenons un exemple sur 4 bits, je vois 6 possibilités :
 
0011
0101
0110
1001
1010
1100
 
Soit 4!/[(4-2)!*2!] = 4*3/2 = 6
 
Non ? Putain je me fais peur là.


Message édité par Evadream -jbd- le 24-03-2003 à 20:03:43
Reply

Marsh Posté le 24-03-2003 à 20:14:59    

++Taz > j'ai édite mon post à 19:30:06 lorsque tu postais, pas de mauvaises intentions de ma part !

Reply

Marsh Posté le 25-03-2003 à 00:10:27    

Phlos a écrit :

Par optimisisation, je veux dire code plus petit et plus rapide  :p  
 
Si tu parles de la question a laquelle l'algo doit répondre, ben euh tu comprends pas le francais alors  :whistle:  


 
bah désolé, je dois avoir du mal aujoud'hui, mais si tu supprimmes la question je vais avoir encore plus de mal  :wahoo:

Reply

Marsh Posté le 25-03-2003 à 07:28:26    

BJOne a écrit :


 
bah désolé, je dois avoir du mal aujoud'hui, mais si tu supprimmes la question je vais avoir encore plus de mal  :wahoo:  


 :??:

Reply

Marsh Posté le 25-03-2003 à 17:40:16    


 
ha merde tu l'avais pas supprimé désolé je suis en mode -ait du mal- cette semaine  [:ddt]

Reply

Marsh Posté le 25-03-2003 à 17:40:16   

Reply

Marsh Posté le 25-03-2003 à 19:16:23    

BJOne a écrit :


 
ha merde tu l'avais pas supprimé désolé je suis en mode -ait du mal- cette semaine  [:ddt]  


 
 [:mr marron derriere]

Reply

Marsh Posté le 25-03-2003 à 20:47:51    

Un petit feedback sur les solutions proposées ?

Reply

Marsh Posté le 26-03-2003 à 00:03:41    

Evadream -jbd- a écrit :

Un petit feedback sur les solutions proposées ?


 
Oui excusez moi  :(  
 
En fait j'ai pas vraiment compris la solution mathématiques, je ne sais plus a quoi correspond le signe "!"  :D  
 
Mais pour mon algorithme, on peut l'optimiser (parceque la vous avez repondu a la question de l'algo mais pas a ma question [optimisation de l'algo])  :??:  
 
 :whistle:  
 
 :hello:


Message édité par Phlos le 26-03-2003 à 00:04:03
Reply

Marsh Posté le 26-03-2003 à 00:14:19    

Y'a pas mal ;)
 
Ok, je suis d'accord qu'on a pas repondu à la question de l'amélioration de l'algo =)  
 
Je me suis pas plongé dedans, mais ca fait un peu bricolage pour essayer toutes les combinaisons possibles. Je veux pas être méchant  hein, ca m'arrive de faire des trucs TRES laids sur des problèmes tout con, tu as qu'à faire une recherche avec mon pseudo :D
 
La, tout de suite, je vois pas. Si tu pouvais le décrire en quelques lignes pour en donner le principe !
 
Sinon le signe "!" correspond à la factorielle. Par exemple, 5! = 5 *4*3*2*1 = 120
 
Ca augmente TRES rapidement.


Message édité par Evadream -jbd- le 26-03-2003 à 00:16:21
Reply

Marsh Posté le 26-03-2003 à 00:39:55    

Bien sur qu'on a repondu a la question de l'algo. La reponse est : n!/(n/2)! qui est plus efficace en terme de complexite que l'algo indiqué ci dessus.
 
Rappel, n!/(n/2)! = produit pour i allant de (n/2)+1 à n de i. Une petite boucle for et c'est reglé

Reply

Marsh Posté le 26-03-2003 à 06:47:12    

approximation de Stirling
 
factoriel(n) ~= sqrt(2*n*PI)*pow(n/E, n)
 
edit: PI et E ne sont pas des constantes standards alors je te conseille soir le #define ou mieux, la definition de constante
 

Code :
  1. const double PI=3.1415926535897932384626433832795;


Message édité par Taz le 26-03-2003 à 08:38:33
Reply

Marsh Posté le 26-03-2003 à 07:37:17    

++Taz a écrit :

approximation de __je_sais_plus_qui__
 
factoriel(n) ~= sqrt(2*n*PI)*pow(n/E, n)
 
edit: PI et E ne sont pas des constantes standards alors je te conseille soir le #define ou mieux, la definition de constante
 

Code :
  1. const double PI=3.1415926535897932384626433832795;




 
...quand n tend vers + l'infini (mauvais souvenirs de sup/spé inside).


Message édité par Max peigne le 26-03-2003 à 07:41:23
Reply

Marsh Posté le 26-03-2003 à 08:18:40    

Max Peigne a écrit :


 
...quand n tend vers + l'infini (mauvais souvenirs de sup/spé inside).

evidemment sinon pas besoin d'approximation. cela dit, si on veut un resultat flottant en double, en utilisant la formule de Stirling, l'overflow est à n=171, et si on veut un resultat entier en unsigned int sur 32 bits, donc en utilisant la méthod enaturelle, l'overflow, c'est à n=13
 
je crois donc qu'une formule d'approximation est la bienvenue
 
perso, quand j'ai fait quelques calculs avec des factoriels, les factoriels de 0 à 13 était des cosntantes précalculées et pour les autres, bien obligé de passer par Stirling


Message édité par Taz le 26-03-2003 à 08:38:18
Reply

Marsh Posté le 26-03-2003 à 09:24:51    

++Taz a écrit :

evidemment sinon pas besoin d'approximation. cela dit, si on veut un resultat flottant en double, en utilisant la formule de Stirling, l'overflow est à n=171, et si on veut un resultat entier en unsigned int sur 32 bits, donc en utilisant la méthod enaturelle, l'overflow, c'est à n=13
 
je crois donc qu'une formule d'approximation est la bienvenue
 
perso, quand j'ai fait quelques calculs avec des factoriels, les factoriels de 0 à 13 était des cosntantes précalculées et pour les autres, bien obligé de passer par Stirling


 
En fait, ce que je voulais souligner, c'est que lui a besoin de n=16 si j'ai bien suivi. Le problème est de savoir si l'approximation est bien valable pour un n si faible.

Reply

Marsh Posté le 26-03-2003 à 17:22:11    

>>> stirling(16)
20814114415223.137
 
>>> factoriel(16)
20922789888000L
 
ça passe à peu pres [:spamafote]

Reply

Marsh Posté le 26-03-2003 à 18:27:57    

Je comprends rien [:meganne]
 
Mais merci  :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed