fonction combinaison en c++

fonction combinaison en c++ - C++ - Programmation

Marsh Posté le 29-08-2013 à 21:15:06    

Est ce qu'il ya une fonction c++ prédéfinie permet de calculer la combinaison de n éléments parmi k ou on doit implémenter cette fonction?

Reply

Marsh Posté le 29-08-2013 à 21:15:06   

Reply

Marsh Posté le 29-08-2013 à 21:58:10    

Une petite recherche sur internet répond à ma question. En fait, on a besoin de coder la fonction combinaison  
 

Code :
  1. float ModèleInterne::combinaison(int n,int q) //la Combinaison de q éléments parmi n
  2. {
  3. float comb;
  4. if(n==q)
  5. {
  6. return 1;
  7. }
  8. else
  9. if(q==1)
  10. {
  11.  return n;
  12. }
  13. else
  14. {
  15.  comb=(n/q)*combinaison(n-1,q-1);
  16.  return comb;
  17. }
  18. }

Reply

Marsh Posté le 30-08-2013 à 01:02:20    

Bonjour !
 
C'est curieux de passer par des flottants pour calculer un C(n,k), non ? Pourquoi ne pas faire le calcul directement avec les factorielles (en le faisant intelligemment pour limiter les risques débordement et limiter les calculs).
 
Toutefois, si vous avez besoin de calculer des combinaisons avec des grands nombres, vous allez devoir vous tourner vers une bibliothèque du genre gmp ou alors, en effet, travailler sur des nombres réels, mais en ayant des valeurs approchées.
 
Bonne continuation !

Reply

Marsh Posté le 30-08-2013 à 12:28:49    

la division n/q va se faire en entier, est-ce bien volontaire ?


---------------
last.fm
Reply

Marsh Posté le 30-08-2013 à 13:16:44    

oui

Reply

Marsh Posté le 30-08-2013 à 13:36:33    

Cela parait curieux ...  
 
Prenons un exemple : comb(12, 8)
 
on arrive à comb = (12/8)*comb(11,7) = comb(11,7)
 
En poussant la récursion, on arrive, sauf erreur de ma part, à 12*comb(5,1) = 60.
 
J'ai du mal à admettre que c'est juste, comme résultat :)
 
Et si vous faites (n*combinaison(n-1,q-1))/q, autant faire le calcul que j'ai évoqué dans mon premier post, cela revient au même, sans empiler les fonctions ...
 
Bonne continuation !
 
Edit : et je ne parle pas du fait que si q > n, on a obtient un nombre négatif.


Message édité par Farian le 30-08-2013 à 13:39:53
Reply

Marsh Posté le 07-02-2014 à 14:17:37    

J'ai codé autrement ma fonction combinaison.

Code :
  1. unsigned long long Cout::combinaison(unsigned long n, unsigned long k) {
  2. unsigned long i;
  3. unsigned long long b;
  4. if (0 == k || n == k)
  5. {
  6. return 1;
  7. }
  8. if (k > n)
  9. {
  10.     return 0;
  11. }
  12. if (1 == k)
  13. {
  14. return n;
  15. }
  16. b = 1;
  17. for (i = 1; i <= k; ++i)
  18. {
  19. b *= (n - (k - i));
  20. if (b < 0)
  21. {
  22.  return -1;
  23. }
  24. b /= i;
  25. }
  26. return b;
  27. }


 
Le problème est que cette fonction ne me donne pas des valeurs exactes pour des grands nombres. Je sens que je dois penser à utiliser une bibliothèque. J'attends vos réponses et vos propositions et merciiiiiiiiiiiiiiiiiii.

Reply

Marsh Posté le 07-02-2014 à 14:40:45    

Ça vaut quoi "sizeof (long)" sur ta machine ? Si c'est 4, essaie d'utiliser des uint64_t comme entier. Il y aura toujours des limites, et si ça ne suffit pas faudra nécessairement passer par des bibliothèques spécialisées.

Reply

Marsh Posté le 07-02-2014 à 14:48:20    

Est ce que les bibliothèques Boost C++ peuvent résoudre mon problème? Je vais utiliser

Code :
  1. #include <boost/math/special_functions/binomial.hpp>


Message édité par kochfet le 08-02-2014 à 12:21:50
Reply

Sujets relatifs:

Leave a Replay

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